Problem:
Chcesz połączyć dane z więcej niż dwóch tabel za pomocą tylko jednej instrukcji SELECT.
Przykład:
W naszej bazie danych znajdują się cztery tabele:student
, teacher
, subject
i learning
.
student
tabela zawiera dane w następujących kolumnach:id
, first_name
i last_name
.
id | imię | nazwisko |
---|---|---|
1 | Tomek | Młynarz |
2 | Jan | Wiosna |
3 | Lisa | Williams |
4 | Elia | Kerka |
5 | James | Moore |
teacher
tabela zawiera dane w następujących kolumnach:id
, first_name
, last_name
i subject
.
id | imię | nazwisko |
---|---|---|
1 | Mediolan | Kowalski |
2 | Karol | Davis |
3 | Zaznacz | Moore |
subject
tabela zawiera dane w następujących kolumnach:id
i name
.
id | imię |
---|---|
1 | angielski |
2 | Sztuka |
3 | Muzyka |
Wreszcie learning
tabela zawiera dane w następujących kolumnach:id
, mark
, subject_id
, student_id
i teacher_id
.
id | znak | subject_id | identyfikator 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 |
Chcemy wiedzieć, którzy uczniowie uczą się angielskiego, muzyki i sztuki, a także jacy nauczyciele prowadzą te zajęcia. Wybierz temat kursu, nazwisko uczestnika kursu i nazwisko nauczyciela prowadzącego ten kurs.
Rozwiązanie:
Użyj wielu opcji JOIN
s w zapytaniu:
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;
To zapytanie zwraca rekordy z nazwą przedmiotu kursu i nazwiskami uczniów i nauczycieli:
subject_name | s_last_name | t_last_name |
---|---|---|
Muzyka | Moore | Młynarz |
Sztuka | Davis | Młynarz |
angielski | Kowalski | Wiosna |
Sztuka | Davis | Williams |
Muzyka | Davis | Kerka |
Muzyka | Moore | Moore |
Te dane pochodzą z trzech tabel, więc musimy połączyć wszystkie te tabele, aby uzyskać informacje, których szukamy.
Dyskusja:
Jeśli chcesz połączyć dane przechowywane w wielu (więcej niż dwóch) tabelach, powinieneś użyć JOIN
operatora wielokrotnie. Najpierw łączysz dwa stoły w normalny sposób (używając JOIN
, LEFT JOIN
, RIGHT JOIN
, lub FULL JOIN
, odpowiednio). JOIN
Operacja tworzy „wirtualną tabelę”, która przechowuje połączone dane z dwóch tabel. W naszym przykładzie tabela wyników jest kombinacją learning
i subject
tabele.
Następnym krokiem jest dołączenie tej tabeli wyników do trzeciej tabeli (w naszym przykładzie student
). To jest jak zwykłe JOIN
:dołączasz do „wirtualnego stołu” i trzeciego stołu z odpowiednim warunkiem. Ten warunek powinien generalnie zawierać jedną lub więcej kolumn z dodatkowej tabeli (student
) i co najmniej jedną kolumnę z „wirtualnej tabeli”. W naszym przykładzie odwołujemy się do student
tabeli w drugim warunku JOIN.
W tym momencie mamy nową wirtualną tabelę z danymi z trzech tabel. Ostatnim krokiem jest dodanie danych z czwartej tabeli (w naszym przykładzie teacher
). i dołącz za pomocą klucza z tych tabel (w naszym przykładzie id
od teacher
table i teacher_id
z learning
tabeli).
Jeśli musisz dołączyć do innego stołu, możesz użyć innego JOIN
operator z odpowiednim warunkiem w klauzuli ON. Teoretycznie możesz dołączyć do dowolnej liczby stołów.