2013-07-21 20 views
15

Mi dispiace per il titolo minimalista ma non so come descriverlo in breve. Ho tre tabelle:SQL JOIN many-to-many

la tabella dei gruppi

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

molti a molti tavolo

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

E la tavola degli elementi

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

Tutto va bene e molto semplice. SELECT che sto cercando di realizzare è la seguente

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

voglio selezionare tutti gli elementi dagli elementi di tabella e impostare il campo genere ad dramma o nulla.

Sto cercando di farlo in MySQL.

Grazie in anticipo

risposta

15

E 'possibile con questo piccolo trucco (outer join sulla molti-a-molti tavolo, con il vincolo che il GroupID deve essere 3 (per il dramma)

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 significa: prendere tutte le righe delle tabelle che hanno preceduto (quelli che si trovano sul lato sinistro mano del LEFT OUTER JOIN, se si vuole), anche se non ci sono linee corrispondenti a loro in foll dovendo tavoli La condizione ON elements.ID = group_elements.ElementID AND group_elements.GroupID = 3 dice che se troviamo qualcosa che corrisponde al nostro ElementID, deve anche essere un dramma (GroupID = 3). Facciamo quindi un altro LEFT OUTER JOIN nella tabella dei gruppi, che ci consente di visualizzare la colonna Genere o NULL se l'elemento non era un dramma.

+0

Non vedo la necessità di restituire una colonna NULL. perché non utilizzare WHERE groups.ID! = '3' o qualcosa del genere. bisides che, quando si esegue il violino in Mysql 5.6 tornerà in ordine diverso! prima le colonne non NULL, rispetto alla colonna NULL. http://sqlfiddle.com/#!9/01cf3/1/0 u potresti utilizzare un'istruzione ORDER BY. –

+1

La mia risposta ha risposto alle esigenze della domanda, che richiedeva la visualizzazione di valori NULL quando il genere del libro (supponendo che si tratti di libri) non è noto. Le query con join esterni sono utili quando si desidera visualizzare _ tutti i dati da una delle tabelle nella query, indipendentemente dall'eventuale presenza di dati correlati altrove. Ad esempio, la query sopra può essere utile in un'applicazione che gestisce una raccolta di libri: ti consente di vedere tutti i libri e identificare quelli che non hai ancora etichettato con un genere. Vedere i generi per i libri che ** sono ** taggati può aiutarti a decidere il genere di un altro libro. –