Проблем:
Искате да комбинирате данни от повече от две таблици, като използвате само един израз SELECT.
Пример:
В нашата база данни има четири таблици:student
, teacher
, subject
, и learning
.
student
таблицата съдържа данни в следните колони:id
, first_name
и last_name
.
id | first_name | фамилно_име |
---|---|---|
1 | Том | Милър |
2 | Джон | Пролет |
3 | Лиза | Уилямс |
4 | Ели | Баркър |
5 | Джеймс | Мур |
teacher
таблицата съдържа данни в следните колони:id
, first_name
, last_name
и subject
.
id | first_name | фамилно_име |
---|---|---|
1 | Милано | Смит |
2 | Чарлз | Дейвис |
3 | Марк | Мур |
subject
таблицата съдържа данни в следните колони:id
и name
.
id | име |
---|---|
1 | английски |
2 | Изкуство |
3 | Музика |
И накрая, learning
таблицата съдържа данни в следните колони:id
, mark
, subject_id
, student_id
и teacher_id
.
id | маркировка | subject_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 |
Искаме да знаем кои ученици изучават английски език, музика и изкуство, както и кои учители преподават в тези класове. Изберете предмета на курса, фамилното име на студента, който е поел този курс, и фамилията на преподавателя, който преподава този курс.
Решение:
Използвайте няколко JOIN
s във вашата заявка:
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;
Тази заявка връща записи с името на предмета на курса и фамилните имена на студентите и преподавателите:
име_на_тема | s_last_name | t_last_name |
---|---|---|
Музика | Мур | Милър |
Изкуство | Дейвис | Милър |
английски | Смит | Пролет |
Изкуство | Дейвис | Уилямс |
Музика | Дейвис | Баркър |
Музика | Мур | Мур |
Тези данни идват от три таблици, така че трябва да обединим всички тези таблици, за да получим информацията, която търсим.
Дискусия:
Ако искате да комбинирате данни, съхранявани в множество (повече от две) таблици, трябва да използвате JOIN
оператор няколко пъти. Първо, присъединявате две таблици, както обикновено (използвайки JOIN
, LEFT JOIN
, RIGHT JOIN
, или FULL JOIN
, както е подходящо). JOIN
операцията създава "виртуална таблица", която съхранява комбинирани данни от двете таблици. В нашия пример таблицата с резултати е комбинация от learning
и subject
таблици.
Следващата стъпка е да присъедините тази таблица с резултати към третата таблица (в нашия пример student
). Това е като обикновен JOIN
:присъединявате се към „виртуалната таблица“ и третата таблица с подходящо условие. Това условие обикновено трябва да включва една или повече колони от допълнителната таблица (student
) и една или повече колони от „виртуалната таблица“. В нашия пример се позоваваме на student
таблица във второто условие JOIN.
В този момент имаме нова виртуална таблица с данни от три таблици. Последната стъпка е да добавите данни от четвъртата таблица (в нашия пример teacher
). и се присъединете, като използвате ключа от тези таблици (в нашия пример id
от teacher
таблица и teacher_id
от learning
таблица).
Ако трябва да се присъедините към друга маса, можете да използвате друг JOIN
оператор с подходящо условие в клаузата ON. На теория можете да се присъедините към толкова маси, колкото искате.