2013-07-21 26 views
15

Xin lỗi về tiêu đề tối giản nhưng tôi không biết mô tả ngắn gọn như thế nào. Tôi có ba bảng:SQL THAM GIA nhiều-nhiều-nhiều

Bảng nhóm

ID | Genre 
----------------- 
1 | Action 
2 | Adventure 
3 | Drama 

Nhiều người đến nhiều bảng

GroupID | ElementID 
----------------- 
    3 | 1 
    1 | 2 
    2 | 2 
    2 | 3 
    3 | 3 

Và bảng của các yếu tố

ID | Element 
----------------- 
1 | Pride and Prejudice 
2 | Alice in Wonderland 
3 | Curious Incident Of A Dog In The Night Time 

Tất cả là tốt và rất đơn giản. SELECT tôi đang cố gắng để đạt được như sau

ID | Element           | Genre 
------------------------------------------------------------- 
1 | Pride and Prejudice        | Drama 
2 | Alice in Wonderland        | NULL 
3 | Curious Incident Of A Dog In The Night Time  | Drama 

Tôi muốn chọn tất cả các yếu tố từ Elements bảng và thiết lập các lĩnh vực thể loại để Drama hoặc rỗng.

Tôi đang cố gắng thực hiện điều này trong MySQL.

Cảm ơn bạn trước

Trả lời

15

Có thể với mẹo nhỏ này (OUTER JOIN trên bàn nhiều-nhiều, với ràng buộc là các groupId phải là 3 (Drama)

http://sqlfiddle.com/#!2/b7c18/2

SELECT elements.ID, elements.Element, groups.Genre 
    FROM elements 
LEFT OUTER JOIN group_elements 
    ON elements.ID = group_elements.ElementID 
AND group_elements.GroupID = 3 
LEFT OUTER JOIN groups 
    ON group_elements.GroupID = groups.ID 

LEFT OUTER JOIN nghĩa: lấy tất cả các dòng từ các bảng có trước (những người mà là ở phía bên tay trái của LEFT OUTER JOIN, nếu bạn sẽ), ngay cả khi không có dòng tương ứng với chúng trong foll owing bàn. Các điều kiện ON elements.ID = group_elements.ElementID AND group_elements.GroupID = 3 nói rằng nếu chúng ta tìm thấy bất cứ điều gì phù hợp với ElementID của chúng tôi, nó cũng phải là một bộ phim (GroupID = 3). Sau đó chúng tôi thực hiện một LEFT OUTER JOIN khác trên bảng nhóm, cho phép chúng tôi hiển thị cột Thể loại, hoặc NULL nếu phần tử không phải là một bộ phim.

+0

tôi không thấy cần trả về cột NULL. tại sao không sử dụng WHERE groups.ID! = '3' hoặc gì đó. bisides rằng, khi chạy bạn đang fiddle trong Mysql 5,6 nó sẽ trở lại theo thứ tự khác nhau! đầu tiên các cột không NULL, hơn cột NULL. http://sqlfiddle.com/#!9/01cf3/1/0 u có thể sử dụng câu lệnh ORDER BY. –

+1

Trả lời của tôi đã trả lời các nhu cầu của câu hỏi, được gọi là giá trị NULL được hiển thị khi thể loại của sách (giả sử đó là sách) không được biết. Các truy vấn có kết nối bên ngoài rất hữu ích khi bạn muốn xem _all_ dữ liệu từ một trong các bảng trong truy vấn, cho dù có bất kỳ dữ liệu nào có liên quan ở nơi khác. Ví dụ: truy vấn trên có thể hữu ích trong ứng dụng quản lý tập hợp sách: nó cho phép bạn xem tất cả các sách và xác định những cuốn sách bạn chưa gắn thẻ với thể loại. Việc xem các thể loại sách được ** gắn thẻ có thể giúp bạn quyết định thể loại của một cuốn sách khác. –