Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Alisson Rodrigues

Utilizando JOINs

Recommended Posts

Fala galera. Estava estudando um pouco sobre os JOINs (INNER JOIN, LEFT JOIN, RIGHT JOIN, etc) e cai num pequeno problema. Acho que há uma solução fácil. Estrutura:

CREATE TABLE `aluno` ( `id_aluno` int(250) NOT NULL auto_increment, `nome` varchar(250) NOT NULL, PRIMARY KEY (`id_aluno`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;CREATE TABLE `aluno_materia` ( `id_aluno` int(250) NOT NULL, `id_materia` int(250) NOT NULL, PRIMARY KEY (`id_aluno`,`id_materia`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;CREATE TABLE `materia` ( `id_materia` int(250) NOT NULL auto_increment, `nome` varchar(250) NOT NULL, PRIMARY KEY (`id_materia`)) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;INSERT INTO `aluno` VALUES (1, 'Andre');INSERT INTO `aluno` VALUES (2, 'Alisson');INSERT INTO `aluno` VALUES (3, 'João');INSERT INTO `aluno` VALUES (4, 'Maria');INSERT INTO `aluno` VALUES (5, 'Pedro');INSERT INTO `aluno_materia` VALUES (1, 8);INSERT INTO `aluno_materia` VALUES (2, 2);INSERT INTO `aluno_materia` VALUES (2, 5);INSERT INTO `aluno_materia` VALUES (3, 2);INSERT INTO `aluno_materia` VALUES (3, 4);INSERT INTO `aluno_materia` VALUES (4, 9);INSERT INTO `aluno_materia` VALUES (5, 1);INSERT INTO `materia` VALUES (1, 'matemática');INSERT INTO `materia` VALUES (2, 'português');INSERT INTO `materia` VALUES (3, 'história');INSERT INTO `materia` VALUES (4, 'geografia');INSERT INTO `materia` VALUES (5, 'química');INSERT INTO `materia` VALUES (6, 'física');INSERT INTO `materia` VALUES (7, 'ed. física');INSERT INTO `materia` VALUES (8, 'inglês');INSERT INTO `materia` VALUES (9, 'filosofia');INSERT INTO `materia` VALUES (10, 'biologia');

Bem, como dá pra perceber, ali em "aluno_materia" eu tenho duas chaves estrangeiras que referem-se exatamente aos ids dos alunos e das matérias. Eu faço um select usando JOIN para juntar os alunos com suas respectivas matérias, e mostro o id, o nome do aluno, e o nome da matéria:

SELECT aluno.*,materia.nome as materia FROM aluno_materia JOIN aluno USING (id_aluno) JOIN materia USING (id_materia)

Até aí funciona tudo muito bem, muito bonito. Mas se vocês repararem, na tabela aluno_materia eu tenho:

INSERT INTO `aluno_materia` VALUES (2, 2);INSERT INTO `aluno_materia` VALUES (2, 5);INSERT INTO `aluno_materia` VALUES (3, 2);INSERT INTO `aluno_materia` VALUES (3, 4);

Ou seja, duas matéria para um mesmo aluno.A questão é: Como faço um SELECT que retorne os resultados da mesma maneira que a query que eu coloquei ali em cima, mas que, quando tiver mais de uma matéria para o mesmo aluno, retorne no campo "materia" as duas (ou mais) matérias separadas por vírgula e não em duas linhas (como se fossem dois alunos distintos) da maneira que acontece na query que eu postei.PS: Quero isso numa única query.Agradeço antecipadamente. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Prescot...potz não vejo muito como você fazer isso direto na sql, com select, sem usar uma rotina php, por exemplo, ou então uma função ou procedure.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então velho amigo walace, estou quase chegando a essa conclusão também hehehe, estou quebrando a cuca aqui, mas vou continuar tentando, nessa minha busca até aprendi bastante coisa que eu nem imaginava que existia em mysql. Mesmo assim vlw. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

faça uns testes com group_concat tbm!

Group_Concat

Já utilizei algumas vezes, com ele você pode agrupar pelo código do aluno (GROUP BY), e utilizar o GROUP_CONCAT para listar as disciplinas, inclusive você pode definir qual o separador.

Acho que pode te ajudar tbm.

Ps: esta função está disponível a partir da versão 4.1.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, vlw cassitos, era usando group_concat mesmo, eu já tinha dado uma olhada nela antes, e... finalmente consegui fazer, foi a query mais dificil que eu fiz na minha vida hehehe. Utilizei JOIN, subquery, e mais as funções DISTINCT e a GROUP_CONCAT:

SELECT DISTINCT id_aluno,aluno.nome,(SELECT GROUP_CONCAT(materia.nome) FROM aluno_materia JOIN materia USING (id_materia) WHERE id_aluno=aluno.id_aluno) as materias FROM aluno_materia JOIN aluno USING (id_aluno) JOIN materia USING (id_materia)

Aprendi um MONTE de coisas só fazendo isso, foi um bom estudo, taí pra quem quiser...Vlw walace e cassitos http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ahnn eu não sou mto costumero a usar JOINS então eu fiz assimSELECT DISTINCT id_aluno,aluno.nome,(SELECT GROUP_CONCAT(materia.nome) FROM aluno_materia, materia WHERE id_aluno=aluno.id_aluno and aluno_materia.id_materia=materia.id_materia) as materias FROM aluno_materia JOIN aluno USING (id_aluno) JOIN materia USING (id_materia)soh deixei os ultimos pos c naum era mto AND heheheheesse GROUP_CONCAT eh uma mão na roda heinsoh fazendo uma leve explicação o JOIN eh a mesma coisa q você separar as duas tabelas por , no FROM e o USING eh a mesma coisa q verificar a igualdade dos campos no where, eu prefiro usar JOINS qndo necessito de LEFT ou RIGHT

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.