Problém:
Chcete zkombinovat data z více než dvou tabulek pomocí pouze jednoho příkazu SELECT.
Příklad:
V naší databázi jsou čtyři tabulky:student
, teacher
, subject
a learning
.
student
tabulka obsahuje data v následujících sloupcích:id
, first_name
a last_name
.
id | křestní_jméno | last_name |
---|---|---|
1 | Tome | Miller |
2 | Jan | Jaro |
3 | Lisa | Williams |
4 | Ellie | Barker |
5 | James | Moore |
teacher
tabulka obsahuje data v následujících sloupcích:id
, first_name
, last_name
a subject
.
id | křestní_jméno | last_name |
---|---|---|
1 | Milán | Smith |
2 | Karel | Davis |
3 | Označit | Moore |
subject
tabulka obsahuje data v následujících sloupcích:id
a name
.
id | jméno |
---|---|
1 | Angličtina |
2 | Umění |
3 | Hudba |
Nakonec learning
tabulka obsahuje data v následujících sloupcích:id
, mark
, subject_id
, student_id
a teacher_id
.
id | označit | subject_id | id_studenta | 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 |
Chceme vědět, kteří studenti studují angličtinu, hudbu a umění, a také kteří učitelé tyto hodiny vedou. Vyberte předmět kurzu, příjmení studenta, který kurz absolvuje, a příjmení učitele, který daný kurz vede.
Řešení:
Použijte více JOIN
s ve vašem dotazu:
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;
Tento dotaz vrací záznamy s názvem předmětu kurzu a příjmeními studentů a učitelů:
název_předmětu | s_last_name | t_last_name |
---|---|---|
Hudba | Moore | Miller |
Umění | Davis | Miller |
Angličtina | Smith | Jaro |
Umění | Davis | Williams |
Hudba | Davis | Barker |
Hudba | Moore | Moore |
Tato data pocházejí ze tří tabulek, takže musíme všechny tyto tabulky spojit, abychom získali informace, které hledáme.
Diskuse:
Pokud chcete zkombinovat data uložená ve více (více než dvou) tabulkách, měli byste použít JOIN
operátor několikrát. Nejprve spojíte dva stoly jako obvykle (pomocí JOIN
, LEFT JOIN
, RIGHT JOIN
nebo FULL JOIN
, podle potřeby). JOIN
operace vytvoří "virtuální tabulku", která ukládá kombinovaná data ze dvou tabulek. V našem příkladu je výsledná tabulka kombinací learning
a subject
tabulky.
Dalším krokem je připojení této výsledkové tabulky ke třetí tabulce (v našem příkladu student
). Je to jako běžný JOIN
:připojíte se k „virtuálnímu stolu“ a ke třetímu stolu s odpovídající podmínkou. Tato podmínka by obecně měla zahrnovat jeden nebo více sloupců z doplňkové tabulky (student
) a jeden nebo více sloupců z „virtuální tabulky“. V našem příkladu odkazujeme na student
tabulky ve druhé podmínce JOIN.
V tuto chvíli máme novou virtuální tabulku s daty ze tří tabulek. Posledním krokem je přidání dat ze čtvrté tabulky (v našem příkladu teacher
). a připojte se pomocí klíče z těchto tabulek (v našem příkladu id
od teacher
tabulka a teacher_id
z learning
tabulka).
Pokud se musíte připojit k jinému stolu, můžete použít další JOIN
operátor s příslušnou podmínkou v klauzuli ON. Teoreticky se můžete připojit k tolika stolům, kolik chcete.