Problema:
Vorresti combinare i dati di più di due tabelle utilizzando una sola istruzione SELECT.
Esempio:
Ci sono quattro tabelle nel nostro database:student
, teacher
, subject
e learning
.
Lo student
la tabella contiene i dati nelle seguenti colonne:id
, first_name
e last_name
.
id | nome | cognome |
---|---|---|
1 | Tom | Mugnaio |
2 | Giovanni | Primavera |
3 | Lisa | Williams |
4 | Elli | Barker |
5 | Giacomo | More |
Il teacher
la tabella contiene i dati nelle seguenti colonne:id
, first_name
, last_name
e subject
.
id | nome | cognome |
---|---|---|
1 | Milano | Fabio |
2 | Carlo | Davis |
3 | Segna | More |
Il subject
la tabella contiene i dati nelle seguenti colonne:id
e first_name
.
id | |
---|---|
1 | Inglese |
2 | Arte |
3 | Musica |
Infine, il learning
la tabella contiene i dati nelle seguenti colonne:id
, mark
, subject_id
, student_id
e teacher_id
.
id | segna | subject_id | ID_studente | ID_insegnante |
---|---|---|---|---|
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 |
Vogliamo sapere quali studenti stanno studiando inglese, musica e arte, nonché quali insegnanti stanno insegnando a queste classi. Seleziona la materia del corso, il cognome dello studente che segue quel corso e il cognome dell'insegnante che tiene quel corso.
Soluzione:
Usa più JOIN
s nella tua richiesta:
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;
Questa query restituisce record con il nome della materia del corso e i cognomi degli studenti e dei docenti:
nome_oggetto | s_last_name | t_last_name |
---|---|---|
Musica | More | Mugnaio |
Arte | Davis | Mugnaio |
Inglese | Fabio | Primavera |
Arte | Davis | Williams |
Musica | Davis | Barker |
Musica | More | More |
Questi dati provengono da tre tabelle, quindi dobbiamo unire tutte quelle tabelle per ottenere le informazioni che cerchiamo.
Discussione:
Se desideri combinare i dati archiviati in più tabelle (più di due), dovresti utilizzare il JOIN
operatore più volte. Per prima cosa, unisci due tabelle come faresti normalmente (usando JOIN
, LEFT JOIN
, RIGHT JOIN
o FULL JOIN
, a seconda dei casi). Il JOIN
l'operazione crea una "tabella virtuale" che memorizza i dati combinati delle due tabelle. Nel nostro esempio, la tabella dei risultati è una combinazione di learning
e subject
tabelle.
Il passaggio successivo consiste nell'unire questa tabella dei risultati alla terza tabella (nel nostro esempio, student
). È come un normale JOIN
:ti unisci al “tavolo virtuale” e al terzo tavolo con una condizione adeguata. Questa condizione dovrebbe generalmente includere una o più colonne della tabella aggiuntiva (student
) e una o più colonne della “tabella virtuale”. Nel nostro esempio, facciamo riferimento allo student
tabella nella seconda condizione JOIN.
A questo punto, abbiamo una nuova tabella virtuale con i dati di tre tabelle. L'ultimo passaggio consiste nell'aggiungere i dati dalla quarta tabella (nel nostro esempio, teacher
). e unisciti usando la chiave di queste tabelle (nel nostro esempio, id
dal teacher
tabella e teacher_id
dal learning
tabella).
Se devi unirti a un altro tavolo, puoi utilizzare un altro JOIN
operatore con una condizione appropriata nella clausola ON. In teoria, puoi unirti a tutti i tavoli che vuoi.