Vấn đề:
Bạn muốn kết hợp dữ liệu từ nhiều hơn hai bảng chỉ bằng một câu lệnh SELECT.
Ví dụ:
Có bốn bảng trong cơ sở dữ liệu của chúng tôi:student
, teacher
, subject
và learning
.
student
bảng chứa dữ liệu trong các cột sau:id
, first_name
và last_name
.
id | first_name | last_name |
---|---|---|
1 | Tom | Miller |
2 | John | Mùa xuân |
3 | Lisa | Williams |
4 | Ellie | Barker |
5 | James | Moore |
teacher
bảng chứa dữ liệu trong các cột sau:id
, first_name
, last_name
và subject
.
id | first_name | last_name |
---|---|---|
1 | Milan | Smith |
2 | Charles | Davis |
3 | Đánh dấu | Moore |
subject
bảng chứa dữ liệu trong các cột sau:id
và name
.
id | tên |
---|---|
1 | Tiếng Anh |
2 | Nghệ thuật |
3 | Âm nhạc |
Cuối cùng, learning
bảng chứa dữ liệu trong các cột sau:id
, mark
, subject_id
, student_id
và teacher_id
.
id | dấusubject_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 |
Chúng tôi muốn biết học sinh nào đang học tiếng Anh, âm nhạc và nghệ thuật, cũng như giáo viên nào đang hướng dẫn các lớp này. Chọn chủ đề khóa học, họ của học sinh tham gia khóa học đó và họ của giáo viên giảng dạy khóa học đó.
Giải pháp:
Sử dụng nhiều JOIN
s trong truy vấn của bạn:
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;
Truy vấn này trả về các bản ghi có tên môn học và họ của học sinh và giáo viên:
subject_name | s_last_name | t_last_name |
---|---|---|
Âm nhạc | Moore | Miller |
Nghệ thuật | Davis | Miller |
Tiếng Anh | Smith | Mùa xuân |
Nghệ thuật | Davis | Williams |
Âm nhạc | Davis | Barker |
Âm nhạc | Moore | Moore |
Dữ liệu này đến từ ba bảng, vì vậy chúng tôi phải kết hợp tất cả các bảng đó lại để có được thông tin chúng tôi tìm kiếm.
Thảo luận:
Nếu bạn muốn kết hợp dữ liệu được lưu trữ trong nhiều (hơn hai) bảng, bạn nên sử dụng JOIN
toán tử nhiều lần. Đầu tiên, bạn tham gia hai bảng như bình thường (sử dụng JOIN
, LEFT JOIN
, RIGHT JOIN
hoặc FULL JOIN
, nếu thích hợp). JOIN
hoạt động tạo ra một "bảng ảo" để lưu trữ dữ liệu kết hợp từ hai bảng. Trong ví dụ của chúng tôi, bảng kết quả là sự kết hợp của learning
và subject
bảng.
Bước tiếp theo là nối bảng kết quả này với bảng thứ ba (trong ví dụ của chúng tôi là student
). Đây giống như một JOIN
thông thường :bạn tham gia "bảng ảo" và bảng thứ ba với một điều kiện thích hợp. Điều kiện này thường phải bao gồm một hoặc nhiều cột từ bảng bổ sung (student
) và một hoặc nhiều cột từ "bảng ảo". Trong ví dụ của chúng tôi, chúng tôi tham chiếu đến student
trong điều kiện JOIN thứ hai.
Tại thời điểm này, chúng ta có một bảng ảo mới với dữ liệu từ ba bảng. Bước cuối cùng là thêm dữ liệu từ bảng thứ tư (trong ví dụ của chúng tôi là teacher
). và tham gia bằng cách sử dụng khóa từ các bảng này (trong ví dụ của chúng tôi là id
từ teacher
bảng và teacher_id
từ learning
bảng).
Nếu bạn phải tham gia một bảng khác, bạn có thể sử dụng JOIN
khác toán tử với một điều kiện thích hợp trong mệnh đề ON. Về lý thuyết, bạn có thể tham gia bao nhiêu bàn tùy thích.