Problem:
Du vill kombinera data från mer än två tabeller med endast en SELECT-sats.
Exempel:
Det finns fyra tabeller i vår databas:student
, teacher
, subject
och learning
.
student
Tabellen innehåller data i följande kolumner:id
, first_name
och last_name
.
id | förnamn | efternamn |
---|---|---|
1 | Tom | Miller |
2 | John | Vår |
3 | Lisa | Williams |
4 | Ellie | Barker |
5 | James | Moore |
teacher
Tabellen innehåller data i följande kolumner:id
, first_name
, last_name
och subject
.
id | förnamn | efternamn |
---|---|---|
1 | Milano | Smith |
2 | Charles | Davis |
3 | Markera | Moore |
subject
Tabellen innehåller data i följande kolumner:id
och name
.
id | namn |
---|---|
1 | Engelska |
2 | Konst |
3 | Musik |
Slutligen, learning
Tabellen innehåller data i följande kolumner:id
, mark
, subject_id
, student_id
och teacher_id
.
id | markera | subject_id | student_id | teacher_id |
---|---|---|---|---|
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 |
Vi vill veta vilka elever som studerar engelska, musik och konst, samt vilka lärare som instruerar dessa klasser. Välj kursämne, efternamnet på studenten som går den kursen och efternamnet på läraren som håller kursen.
Lösning:
Använd flera JOIN
s i din fråga:
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;
Denna fråga returnerar poster med namnet på kursämnet och efternamnen på eleverna och lärarna:
ämnesnamn | s_last_name | t_last_name |
---|---|---|
Musik | Moore | Miller |
Konst | Davis | Miller |
Engelska | Smith | Vår |
Konst | Davis | Williams |
Musik | Davis | Barker |
Musik | Moore | Moore |
Dessa data kommer från tre tabeller, så vi måste sammanfoga alla dessa tabeller för att få den information vi söker.
Diskussion:
Om du vill kombinera data lagrade i flera (fler än två) tabeller bör du använda JOIN
operatör flera gånger. Först sammanfogar du två tabeller som vanligt (med JOIN
, LEFT JOIN
, RIGHT JOIN
, eller FULL JOIN
, efter behov). JOIN
operation skapar en "virtuell tabell" som lagrar kombinerade data från de två tabellerna. I vårt exempel är resultattabellen en kombination av learning
och subject
tabeller.
Nästa steg är att koppla den här resultattabellen till den tredje tabellen (i vårt exempel, student
). Det här är som en vanlig JOIN
:du går med i den "virtuella tabellen" och den tredje tabellen med ett lämpligt villkor. Detta villkor bör i allmänhet inkludera en eller flera kolumner från tilläggstabellen (student
) och en eller flera kolumner från den "virtuella tabellen". I vårt exempel refererar vi till student
tabell i det andra JOIN-villkoret.
Vid det här laget har vi en ny virtuell tabell med data från tre tabeller. Det sista steget är att lägga till data från den fjärde tabellen (i vårt exempel, teacher
). och gå med med nyckeln från dessa tabeller (i vårt exempel, id
från teacher
tabell och teacher_id
från learning
tabell).
Om du måste gå med i ett annat bord kan du använda en annan JOIN
operatör med ett lämpligt villkor i ON-klausulen. I teorin kan du gå med i så många bord du vill.