4
respostas

sempre no join eu tenho que usar o primary key da tabela que estou juntando?

eu fiz o join de uma maneira diferente e veio um campo a mais na minha consulta

SELECT a.nome, c.nome, AVG(n.nota) AS media FROM nota n
JOIN resposta r ON r.id = n.resposta_id
JOIN aluno a ON a.id = r.aluno_id
JOIN matricula m ON m.aluno_id = a.id
JOIN curso c ON c.id = m.curso_id
GROUP BY a.nome, c.nome
HAVING AVG(n.nota) < 5
4 respostas

Qual é o resultado da sua consulta, Marcos? Que campo veio a mais?

o problema está no join que vincula o curso a matricula:

"JOIN curso c ON c.id = m.curso_id"

Se vincular o curso à seção funciona igual ao do exercício:

"JOIN curso c ON c.id = s.curso_id"

Acredito que neste caso a query do Marcos seja a correta para o exercício, pois a ideia é trazer os alunos com média abaixo de 5. Por mais que os 2 registros sejam do mesmo aluno, tratam-se de cursos diferentes, ou seja, ele repetiu nos dois.

Segue resultado:

Renata Alonso C# e orientação a objetos 4.857142

Renata Alonso Desenvolvimento mobile com Android 4.857142

Eu já verifiquei algumas coisas, também achei estranho na hora que vi, mas cá vamos nós.

Você pode ver que há uma relação entre as tabelas e que, para cada exercício, há uma seção e que a seção contém o id do curso. Baseado nisso, eu entendi que (acredito que o meu raciocínio esteja certo) os exercícios são divididos em seções pelos cursos e é possível verificar que não há exercícios para o curso de android, então, não há como ele retornar uma média para um aluno, mesmo matriculado no curso, aonde este curso não tem exercícios para definir a média.

E, respondendo a pergunta do tópico: Você precisa relacionar a chave estrangeira com a chave de origem, no caso dos exercícios, sempre associamos a chave estrangeira a chave primária da outra tabela.

Boa noite pessoal. Bom, pelo menos não fui só eu que "bati biela" nisso. Já abri um tópico pra tentar entender o que está acontecendo. Se essa query que tu postasse é a calcula a média de notas de aluno por curso vai acabar reproduzindo um resultado "inesperado".

SELECT a.nome, c.nome, AVG(n.nota) AS media FROM nota n
JOIN resposta r ON r.id = n.resposta_id
JOIN aluno a ON a.id = r.aluno_id
JOIN matricula m ON m.aluno_id = a.id
JOIN curso c ON c.id = m.curso_id
GROUP BY a.nome, c.nome

Resposta:

Alberto Santos    C# e orientação a objetos    5.777777
Alberto Santos    Scrum e métodos ágeis    5.777777
Frederico José    C# e orientação a objetos    6.250000
Frederico José    Desenvolvimento web com VRaptor    6.250000
Frederico José    SQL e banco de dados    6.250000
João da Silva    C# e orientação a objetos    6.285714
João da Silva    SQL e banco de dados    6.285714
Renata Alonso    C# e orientação a objetos    4.857142
Renata Alonso    Desenvolvimento mobile com Android    4.857142

Notei que isso acontece quando navegamos pela tabela de matrícula, mas não tenho certeza do motivo!