2013-07-21 18 views
15

Przepraszam za minimalistyczny tytuł, ale nie wiem, jak to opisać w skrócie. Mam trzy tabele:SQL DOŁĄCZ wiele-do-wielu

tabeli grupy

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

wiele do wielu tabeli

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

a pierwiastków

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

Wszystko jest w porządku i bardzo proste. SELECT staram się osiągnąć jest następujące

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

Chcę wybrać wszystkie elementy z elementów tabeli i ustawić pole gatunek do Dramatu lub zerowej.

Próbuję to zrobić w MySQL.

góry dziękuję

Odpowiedz

15

Jest to możliwe dzięki tej małej sztuczki (OUTER JOIN na wiele-do-wielu tabeli, z ograniczeniem, że GroupID musi być 3 (za dramat)

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 oznacza: wziąć wszystkie wiersze z tabel, które poprzedziły (te, które znajdują się po lewej stronie strony LEFT OUTER JOIN, jeśli będzie), nawet jeśli nie ma linii odpowiadających im w Folla dzięki tabelom. Warunek ON elements.ID = group_elements.ElementID AND group_elements.GroupID = 3 mówi, że jeśli znajdziemy coś, co pasuje do naszego ElementID, to musi to być także dramat (GroupID = 3). Następnie wykonujemy kolejne LEWE ZEWNĘTRZNE PRZYŁĄCZENIE w tabeli grup, co pozwala nam wyświetlić kolumnę Gatunek lub NULL, jeśli element nie był dramatem.

+0

Nie widzę potrzeby zwracania kolumny NULL. dlaczego nie użyć WHERE groups.ID! = '3' lub czegoś takiego. bisides, które przy uruchomieniu gry w MySQL 5,6 powrócą w innej kolejności! najpierw kolumny inne niż NULL, niż kolumna NULL. http://sqlfiddle.com/#!9/01cf3/1/0 można użyć instrukcji ORDER BY. –

+1

Moja odpowiedź odpowiedziała na potrzeby pytania, które wymagało wyświetlania wartości NULL, gdy gatunek książki (zakładając, że są to książki) nie jest znany. Zapytania z połączeniami zewnętrznymi są użyteczne, gdy chcesz zobaczyć _all_ dane z jednej z tabel w zapytaniu, bez względu na to, czy są jakieś powiązane dane w innym miejscu. Na przykład powyższe zapytanie może być przydatne w aplikacji zarządzającej kolekcją książek: pozwala wyświetlić wszystkie książki i zidentyfikować te, które jeszcze nie zostały oznaczone gatunek. Oglądanie gatunków dla książek, które ** są oznaczone **, może pomóc w podjęciu decyzji o gatunku innej książki. –