MySQL Left Outer Join, Elemente in der zweiten Tabelle ausschließen, die dem Benutzer gehört

8

Ich habe zwei Tabellen in meiner MySQL-Datenbank, eine ist eine Bibliothek aller Bücher in der Datenbank und die andere enthält einzelne Zeilen, die den Büchern in der Bibliothek eines Benutzers entsprechen.

Zum Beispiel:

Bibliothekstabelle

%Vor%

Sammlungstabelle

%Vor%

Ich möchte eine Abfrage ausführen, die alle Bücher anzeigt, die in der Benutzersammlung nicht sind. Ich kann diese Abfrage ausführen, um alle Bücher anzuzeigen, die nicht in der beliebigen Benutzersammlung enthalten sind:

%Vor%

Das funktioniert soweit ich weiß. Wenn Sie dies in PHPMyAdmin ausführen, werden alle Bücher ausgegeben, die nicht in der Sammeltabelle enthalten sind.

Wie kann ich das jedoch auf einen bestimmten Benutzer beschränken? Mit den obigen Dummy-Daten möchte ich beispielsweise Buch 1 ausgeben, wenn Benutzer 2 die Abfrage ausführt, und keine Bücher, wenn Benutzer 1 die Abfrage ausführt.

Das Hinzufügen von AND user=[id] funktioniert nicht, und mit meiner extrem begrenzten Kenntnis von JOIN statements komme ich nicht wirklich voran.

Auch die ID der zurückgegebenen Ergebnisse (der Abfrage, die nicht das tut, was ich will, aber funktioniert) ist 0-- Wie stelle ich sicher, dass die zurückgegebene ID die von library.id ist?

    
Andrew M 15.06.2012, 21:13
quelle

2 Antworten

12

Sie müssen Ihre LEFT JOIN Auswahl auf nur die Bücher eingrenzen, die ein bestimmter Benutzer hat, dann was auch immer NULL in der verbundenen Tabelle sind Zeilen (Bücher) für welche Der Benutzer hat nicht in seiner Sammlung:

%Vor%

Eine Alternative ist:

%Vor%

Die erste Lösung ist jedoch optimaler, da MySQL die Unterabfrage NOT IN einmal für jede Zeile und nicht nur einmal für die gesamte Abfrage ausführt. Intuitiv würden Sie erwarten, dass MySQL die Unterabfrage einmal ausführt und als Liste verwendet, aber MySQL ist nicht intelligent genug, um zwischen korrelierten und nicht korrelierten Unterabfragen zu unterscheiden.

Wie bereits erwähnt hier :

  

"Das Problem ist, dass für eine Anweisung, die eine IN-Unterabfrage verwendet, die   Das Optimierungsprogramm schreibt es als korrelierte Unterabfrage um. "

    
Zane Bien 15.06.2012, 21:20
quelle
3

Wie wäre es damit? Es ist nur von Anfang an - ich habe keinen Zugang zu einer Datenbank, an der ich gerade testen kann. (Entschuldigung)

%Vor%     
Joe Dyndale 15.06.2012 21:30
quelle

Tags und Links