2013-07-21 4 views
15

Entschuldigung für den minimalistischen Titel, aber ich weiß nicht, wie ich es kurz beschreiben soll. Ich habe drei Tabellen:SQL JOIN many-to-many

Die Tabelle der Gruppen

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

Viele zu viele Tabellen

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

Und die Tabelle der Elemente

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

Alles ist in Ordnung und sehr einfach. Die SELECT-I zu erreichen versuche, ist die folgende

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

I alle die Elemente aus der Tabelle Elemente und setzen das Genre Feld Drama- oder null auswählen möchten.

Ich versuche dies in MySQL zu tun.

Vielen Dank im Voraus

Antwort

15

Es ist möglich, mit diesem kleinen Trick (OUTER JOIN auf der many-to-many-Tabelle, mit der Einschränkung, dass der GroupID 3 (for Drama)

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

sein muss
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 bedeutet: aus den Tabellen alle Linien nehmen, die (diejenigen, die auf der linken Seite der LEFT OUTER JOIN sind, wenn man so will) voraus, auch wenn es ihnen keine Linien ist in den folg entsprechenden geschuldete Tabellen. Die Bedingung ON elements.ID = group_elements.ElementID AND group_elements.GroupID = 3 besagt, dass, wenn wir etwas finden, das unserer ElementID entspricht, es auch ein Drama sein muss (GroupID = 3). Dann machen wir einen weiteren LEFT OUTER JOIN in der groups-Tabelle, der es uns ermöglicht, die Genre-Spalte anzuzeigen, oder NULL, wenn das Element kein Drama war.

+0

Ich sehe keine Notwendigkeit, eine NULL-Spalte zurückzugeben. warum nicht ein WHERE groups.ID! = '3' oder so etwas verwenden. bisides, dass, wenn Sie laufen in Mysql 5.6 Sie Geige sind, wird es in anderer Reihenfolge zurückkehren! zuerst die Nicht-NULL-Spalten, dann die NULL-Spalte. http://sqlfiddle.com/#!9/01cf3/1/0 Sie könnten eine ORDER BY-Anweisung verwenden. –

+1

Meine Antwort beantwortete die Bedürfnisse der Frage, die forderte, dass NULL-Werte angezeigt werden, wenn das Genre des Buches (vorausgesetzt, dass es sich um Bücher handelt) nicht bekannt ist. Abfragen mit Outer-Joins sind nützlich, wenn Sie _all_ die Daten aus einer der Tabellen in der Abfrage anzeigen möchten, unabhängig davon, ob an einer anderen Stelle Daten vorhanden sind. Die obige Abfrage kann beispielsweise in einer Anwendung nützlich sein, die eine Büchersammlung verwaltet: Sie können alle Bücher anzeigen und diejenigen identifizieren, die noch nicht mit einem Genre gekennzeichnet sind. Wenn Sie die Genres für Bücher sehen, die ** markiert sind, können Sie sich für das Genre eines anderen Buches entscheiden. –