Consulta SQL entre tabelas
Boa tarde a todos!
Estou com problema em uma consulta SQL que tenho que fazer de um sistema. Esta consulta seria feita entre 4 tabelas.
Tabela 1 = Alunos
Tabela 2 = Módulos
Tabela 3 = Módulos_Comprados
Tabela 4 = Notas
A questão é a seguinte: Tenho que através de uma consulta trazer em um grid o nome do aluno, o nome do módulo, a nota e a situação (aprovado ou reprovado).
A tabela Alunos esta ligada a tabela módulos comprados e notas. A tabela Módulos está ligada a tabela Módulos_Comprados e Módulos_Comprados está ligada a tabela Notas.
Tentei este script e funcionou no primeiro teste, porém quando cadastrei mais um módulo com suas notas para um aluno, o resultado duplicou, trazendo o nome do módulo com as duas notas e não apenas uma só.
Aguem poderia me dar uma luz?
Desde já agradeço a todos.
Estou com problema em uma consulta SQL que tenho que fazer de um sistema. Esta consulta seria feita entre 4 tabelas.
Tabela 1 = Alunos
Tabela 2 = Módulos
Tabela 3 = Módulos_Comprados
Tabela 4 = Notas
A questão é a seguinte: Tenho que através de uma consulta trazer em um grid o nome do aluno, o nome do módulo, a nota e a situação (aprovado ou reprovado).
A tabela Alunos esta ligada a tabela módulos comprados e notas. A tabela Módulos está ligada a tabela Módulos_Comprados e Módulos_Comprados está ligada a tabela Notas.
Tentei este script e funcionou no primeiro teste, porém quando cadastrei mais um módulo com suas notas para um aluno, o resultado duplicou, trazendo o nome do módulo com as duas notas e não apenas uma só.
SELECT NOTAS.CODIGO, NOTAS.NOTA, NOTAS.SITUACAO, ALUNOS.NOME, MODULOS.NOME FROM NOTAS INNER JOIN ALUNOS ON (NOTAS.COD_ALUNO = ALUNOS.CODIGO) INNER JOIN MODULOS_COMPRADOS ON (NOTAS.COD_ALUNO = MODULOS_COMPRADOS.COD_ALUNO) INNER JOIN MODULOS ON (MODULOS_COMPRADOS.COD_MODULOS = MODULOS.CODIGO) WHERE NOTAS.COD_ALUNO = '1' ORDER BY MODULOS.CODIGO
Aguem poderia me dar uma luz?
Desde já agradeço a todos.
Bruno Figueiredo
Curtidas 0
Melhor post
Rafael Souza
05/06/2014
Tenta isso:
SELECT N.ID_NOTA, N.NOTA, N.SITUACAO, A.NOME, M.MODULO
FROM NOTAS N
INNER JOIN ALUNOS A
ON (N.ID_ALUNO = A.ID_ALUNO)
INNER JOIN MODULOS_COMPRADOS MC
ON (A.ID_ALUNO = MC.ID_ALUNO)
INNER JOIN MODULOS M
ON (MC.ID_MODULO = M.ID_MODULO AND N.ID_MODULO = M.ID_MODULO)
[img]http://arquivo.devmedia.com.br/forum/imagem/264793-20140605-123709.png[/img]
SELECT N.ID_NOTA, N.NOTA, N.SITUACAO, A.NOME, M.MODULO
FROM NOTAS N
INNER JOIN ALUNOS A
ON (N.ID_ALUNO = A.ID_ALUNO)
INNER JOIN MODULOS_COMPRADOS MC
ON (A.ID_ALUNO = MC.ID_ALUNO)
INNER JOIN MODULOS M
ON (MC.ID_MODULO = M.ID_MODULO AND N.ID_MODULO = M.ID_MODULO)
[img]http://arquivo.devmedia.com.br/forum/imagem/264793-20140605-123709.png[/img]
GOSTEI 1
Mais Respostas
Jefferson Santos
04/06/2014
Tente utilizar SUM(NOTAS.NOTA), e no NOTAS.SITUACAO utilize a clausula Case.
Só o SUM(NOTAS.NOTA) vai trazer o somatorio total das notas do aluno.
Só o SUM(NOTAS.NOTA) vai trazer o somatorio total das notas do aluno.
GOSTEI 0
Jefferson Santos
04/06/2014
Melhor, se necessario utilize uma função de agregação. Pois não sei se sua consulta deve ter somente a soma total.
GOSTEI 0
Bruno Figueiredo
04/06/2014
Jefferson muito obrigado por sua resposta.
Mas a minha consulta tem que trazer apenas as notas mesmo de cada módulo que o aluno está matriculado.
Para ilustrar, vou postar o resultado deste meu código.
[img]http://arquivo.devmedia.com.br/forum/imagem/373107-20140604-165837.png[/img]
O que teria que acontecer era trazer apenas dois registros:
Introdução a informática com a nota 10 e windows 7 com a nota 0
porém este código repete... ele pega cada módulo e mostra cada uma das notas nele mesmo e não só a nota referente.
Mas a minha consulta tem que trazer apenas as notas mesmo de cada módulo que o aluno está matriculado.
Para ilustrar, vou postar o resultado deste meu código.
[img]http://arquivo.devmedia.com.br/forum/imagem/373107-20140604-165837.png[/img]
O que teria que acontecer era trazer apenas dois registros:
Introdução a informática com a nota 10 e windows 7 com a nota 0
porém este código repete... ele pega cada módulo e mostra cada uma das notas nele mesmo e não só a nota referente.
GOSTEI 0
Cauê Nishijima
04/06/2014
Não sei se entendi corretamente, mas já tentou trocar INNER JOIN por LEFT JOIN?
GOSTEI 0
Bruno Figueiredo
04/06/2014
Cauê, tentei também mas sem sucesso.
Improvisei temporariamente com o código abaixo, me traz os dados corretamente, mas exclui a exibição do nome do aluno, com esse código trago apenas o nome do módulo, a nota e a situação do aluno logado.
Improvisei temporariamente com o código abaixo, me traz os dados corretamente, mas exclui a exibição do nome do aluno, com esse código trago apenas o nome do módulo, a nota e a situação do aluno logado.
SELECT MODULOS.NOME, NOTAS.NOTA, NOTAS.SITUACAO FROM NOTAS INNER JOIN MODULOS ON (NOTAS.COD_MODULOS_COMPRADOS = MODULOS.CODIGO) WHERE NOTAS.COD_ALUNO = '1' ORDER BY MODULOS.NOME
GOSTEI 0
Cauê Nishijima
04/06/2014
Vou montar a base aqui pra verificar, a tabela NOTAS tem a coluna COD_MODULO correto?
GOSTEI 0
Cauê Nishijima
04/06/2014
Se possuir acredito que seja só fazer:
SELECT NOTAS.CODIGO, NOTAS.NOTA, NOTAS.SITUACAO, ALUNOS.NOME, MODULOS.NOME FROM NOTAS INNER JOIN ALUNOS ON (ALUNOS.CODIGO = NOTAS.COD_ALUNO) INNER JOIN MODULOS ON (MODULOS.CODIGO = NOTAS.COD_MODULO) WHERE NOTAS.COD_ALUNO = '1' ORDER BY MODULOS.CODIGO
GOSTEI 0
Rafael Souza
04/06/2014
Depois basta colocar na cláusula where a condição id_aluno = 1 blz..
GOSTEI 0
Bruno Figueiredo
04/06/2014
Rafael, seu código está perfeito!
100% com o que eu precisava.
Muito obrigado e parabéns!
100% com o que eu precisava.
Muito obrigado e parabéns!
GOSTEI 0
Rafael Souza
04/06/2014
Disponha, estamos ai!
GOSTEI 0
Bruno Figueiredo
04/06/2014
Para quem tiver a mesma dúvida, segue abaixo o código que funcionou fino, com a ajuda de todos.
Dei uma incrementada referente a exibição.
Problema solucionado!
Muito obrigado a todos!
Abraço
Dei uma incrementada referente a exibição.
SELECT NOTAS.CODIGO, NOTAS.NOTA, ALUNOS.NOME, MODULOS.NOME, CASE NOTAS.SITUACAO WHEN 'AP' THEN 'APROVADO' WHEN 'RP' THEN 'REPROVADO' WHEN 'RC' THEN 'RECUPERAÇÃO' END AS SITUACAO_ALUNO FROM NOTAS INNER JOIN ALUNOS ON (NOTAS.COD_ALUNO = ALUNOS.CODIGO) INNER JOIN MODULOS_COMPRADOS ON (ALUNOS.CODIGO = MODULOS_COMPRADOS.COD_ALUNO) INNER JOIN MODULOS ON (MODULOS_COMPRADOS.COD_MODULOS = MODULOS.CODIGO AND NOTAS.COD_MODULOS_COMPRADOS = MODULOS.CODIGO) WHERE NOTAS.COD_ALUNO=:PALUNO
Problema solucionado!
Muito obrigado a todos!
Abraço
GOSTEI 0