Problema:
Você gostaria de combinar dados de mais de duas tabelas usando apenas uma instrução SELECT.
Exemplo:
Existem quatro tabelas em nosso banco de dados:
student , teacher , subject e learning . O
student tabela contém dados nas seguintes colunas:id , first_name e last_name . | id | first_name | last_name |
|---|---|---|
| 1 | Tom | Moleiro |
| 2 | João | Primavera |
| 3 | Lisa | Williams |
| 4 | Ellie | Barker |
| 5 | James | Mouro |
O
teacher tabela contém dados nas seguintes colunas:id , first_name , last_name e subject . | id | first_name | last_name |
|---|---|---|
| 1 | Milão | Smith |
| 2 | Carlos | Davis |
| 3 | Marcar | Mouro |
O
subject tabela contém dados nas seguintes colunas:id e name . | id | nome |
|---|---|
| 1 | Inglês |
| 2 | Arte |
| 3 | Música |
Por fim, o
learning tabela contém dados nas seguintes colunas:id , mark , subject_id , student_id e teacher_id . | id | marcar | subject_id | id_aluno | id_do_professor |
|---|---|---|---|---|
| 1 | 4 | 1 | 2 | 1 |
| 2 | 5 | 2 | 3 | 2 |
| 3 | 4 | 3 | 1 | 3 |
| 4 | 3 | 2 | 1 | 2 |
| 5 | 2 | 3 | 5 | 3 |
| 6 | 3 | 3 | 4 | 2 |
Queremos saber quais alunos estão estudando inglês, música e arte, bem como quais professores estão ministrando essas aulas. Selecione o assunto do curso, o sobrenome do aluno que está fazendo esse curso e o sobrenome do professor que ministra esse curso.
Solução:
Use vários
JOIN s em sua consulta:SELECT l.name AS subject_name, t.last_name AS student_last_name, st.last_name AS teacher_last_name FROM learning AS l JOIN subject s ON l.subject_id=s.id JOIN student st ON l.student_id=st.id JOIN teacher t ON l.teacher_id=t.id;
Esta consulta retorna registros com o nome da disciplina do curso e os sobrenomes dos alunos e professores:
| subject_name | s_last_name | t_last_name |
|---|---|---|
| Música | Mouro | Moleiro |
| Arte | Davis | Moleiro |
| Inglês | Smith | Primavera |
| Arte | Davis | Williams |
| Música | Davis | Barker |
| Música | Mouro | Mouro |
Esses dados vêm de três tabelas, então temos que juntar todas essas tabelas para obter as informações que buscamos.
Discussão:
Se você quiser combinar dados armazenados em várias (mais de duas) tabelas, você deve usar o
JOIN operador várias vezes. Primeiro, você junta duas tabelas como faria normalmente (usando JOIN , LEFT JOIN , RIGHT JOIN , ou FULL JOIN , como apropriado). O JOIN A operação cria uma “tabela virtual” que armazena dados combinados das duas tabelas. Em nosso exemplo, a tabela de resultados é uma combinação de learning e subject mesas. O próximo passo é juntar esta tabela de resultados à terceira tabela (no nosso exemplo,
student ). Isso é como um JOIN normal :você junta a “mesa virtual” e a terceira mesa com uma condição apropriada. Essa condição geralmente deve incluir uma ou mais colunas da tabela adicional (student ) e uma ou mais colunas da “tabela virtual”. Em nosso exemplo, fazemos referência ao student tabela na segunda condição JOIN. Neste ponto, temos uma nova tabela virtual com dados de três tabelas. A última etapa é adicionar dados da quarta tabela (no nosso exemplo,
teacher ). e junte-se usando a chave dessas tabelas (no nosso exemplo, id do teacher tabela e teacher_id do learning tabela). Se você tiver que ingressar em outra tabela, poderá usar outro
JOIN operador com uma condição apropriada na cláusula ON. Em teoria, você pode juntar quantas tabelas quiser.