Se o aluno não respondeu o exercício, então não terá nenhuma entrada na tabela de respostas para aquele exercício. Mas ao fazer uma busca pelo id do exercício igual a 1, você está automaticamente excluindo os que não responderam.
Além disso, a ordem das tabelas importa no LEFT JOIN
. Por exemplo, se eu fizer:
SELECT r.resposta_dada, a.nome
FROM resposta r LEFT JOIN aluno a on a.id = r.aluno_id;
Ele vai trazer todos os registros da tabela resposta
, e apenas os alunos que deram alguma resposta:
resposta_dada |
nome |
uma selecao |
João da Silva |
ixi, nao sei |
João da Silva |
alterar dados |
João da Silva |
eskecer o where e alterar tudo |
João da Silva |
apagar coisas |
João da Silva |
tb nao pode eskecer o where |
João da Silva |
inserir dados |
João da Silva |
buscar dados |
Frederico José |
select campos from tabela |
Frederico José |
alterar coisas |
Frederico José |
ixi, nao sei |
Frederico José |
tempo pra fazer algo |
Alberto Santos |
1 a 4 semanas |
Alberto Santos |
melhoria do processo |
Alberto Santos |
todo dia |
Alberto Santos |
reuniao de status |
Alberto Santos |
todo dia |
Alberto Santos |
o quadro branco |
Alberto Santos |
um metodo agil |
Alberto Santos |
tem varios outros |
Alberto Santos |
eh a internet |
Renata Alonso |
browser faz requisicao, servidor manda resposta |
Renata Alonso |
eh o servidor que lida com http |
Renata Alonso |
nao sei |
Renata Alonso |
banco de dados! |
Renata Alonso |
eh colocar a app na internet |
Renata Alonso |
depende da tecnologia, mas geralmente eh levar pra um servidor que ta na internet |
Renata Alonso |
Mas se eu colocar a tabela de alunos primeiro:
SELECT r.resposta_dada, a.nome
FROM aluno a LEFT JOIN resposta r on a.id = r.aluno_id;
Agora ele vai trazer todos os alunos, inclusive aqueles que não deram nenhuma resposta:
resposta_dada |
nome |
inserir dados |
João da Silva |
tb nao pode eskecer o where |
João da Silva |
apagar coisas |
João da Silva |
eskecer o where e alterar tudo |
João da Silva |
alterar dados |
João da Silva |
ixi, nao sei |
João da Silva |
uma selecao |
João da Silva |
ixi, nao sei |
Frederico José |
alterar coisas |
Frederico José |
select campos from tabela |
Frederico José |
buscar dados |
Frederico José |
tem varios outros |
Alberto Santos |
um metodo agil |
Alberto Santos |
o quadro branco |
Alberto Santos |
todo dia |
Alberto Santos |
reuniao de status |
Alberto Santos |
todo dia |
Alberto Santos |
melhoria do processo |
Alberto Santos |
1 a 4 semanas |
Alberto Santos |
tempo pra fazer algo |
Alberto Santos |
depende da tecnologia, mas geralmente eh levar pra um servidor que ta na internet |
Renata Alonso |
eh colocar a app na internet |
Renata Alonso |
banco de dados! |
Renata Alonso |
nao sei |
Renata Alonso |
eh o servidor que lida com http |
Renata Alonso |
browser faz requisicao, servidor manda resposta |
Renata Alonso |
eh a internet |
Renata Alonso |
|
Paulo da Silva |
|
Carlos Cunha |
|
Paulo José |
|
Manoel Santos |
|
Renata Ferreira |
|
Paula Soares |
|
Jose da Silva |
|
Danilo Cunha |
|
Zilmira José |
|
Cristaldo Santos |
|
Osmir Ferreira |
|
Claudio Soares |
Repare que os últimos alunos não tem resposta (são os que não deram nenhuma resposta, ou seja, não tem nenhum registro correspondente na tabela resposta
). Neste caso, o resultado é NULL
(mas eu coloquei como “nada” na tabela acima, pra ficar mais fácil visualizar que não tem nada).
Para mais detalhes sobre os diferentes tipos de JOIN
, leia aqui.
Enfim, ao começar seu SELECT
pela tabela exercicio
, você já está excluindo os alunos que não deram a resposta para um exercício. Além disso, você tem que considerar os que tem id
nulo, pois quando o aluno não respondeu, as colunas referentes ao exercício serão NULL
. Ou seja:
SELECT e.pergunta, a.nome, r.resposta_dada
FROM aluno a
LEFT JOIN resposta r ON a.id = r.aluno_id
LEFT JOIN exercicio e ON e.id=r.exercicio_id
WHERE r.exercicio_id=1 OR r.exercicio_id IS NULL
ORDER BY e.id, a.id
O resultado será:
pergunta |
nome |
resposta_dada |
|
Paulo da Silva |
|
|
Carlos Cunha |
|
|
Paulo José |
|
|
Manoel Santos |
|
|
Renata Ferreira |
|
|
Paula Soares |
|
|
Jose da Silva |
|
|
Danilo Cunha |
|
|
Zilmira José |
|
|
Cristaldo Santos |
|
|
Osmir Ferreira |
|
|
Claudio Soares |
|
O que é um select? |
João da Silva |
uma selecao |
O que é um select? |
Frederico José |
buscar dados |
Para os alunos que não responderam nenhuma pergunta, não aparecerá nada nas respectivas colunas (o que faz sentido, afinal se eles não responderam, não é para aparecer a pergunta nem a resposta).
Repare também que os valores nulos aparecem primeiro. Se quiser que eles sejam os últimos, pode trocar a ordenação para ORDER BY ISNULL(e.id) , a.id
.
Só para constar, daria para corrigir sua query trocando o LEFT JOIN
por RIGHT JOIN
:
SELECT e.pergunta, a.nome, r.resposta_dada
FROM exercicio e
RIGHT JOIN resposta r ON e.id = r.exercicio_id
RIGHT JOIN aluno a ON a.id = r.aluno_id
WHERE e.id = 1 OR e.id IS NULL
ORDER BY e.id, a.id;
O RIGHT JOIN
é similar ao LEFT JOIN
, mas “ao contrário”: enquanto o LEFT
traz tudo da primeira tabela, o RIGHT
traz tudo da segunda (ou seja, tabela1 LEFT JOIN tabela2
é o mesmo que tabela2 RIGTH JOIN tabela1
).