MySQL Left Outer Join, Ausschließen Elemente, die in der Zweiten Tabelle Gehörenden Benutzer
Ich habe zwei Tabellen in meiner MySQL-Datenbank ist eine Bibliothek, die alle Bücher in der Datenbank, und die andere ist mit einzelnen Zeilen entsprechend die Bücher sind in einer Benutzer-Bibliothek.
Beispiel:
Bibliothek Tabelle
`id` `title`...
===== ===========
1 Moby Dick
2 Harry Potter
Sammlung Tabelle
`id` `user` `book`
===== ====== =======
1 1 2
2 2 2
3 1 1
Was ich will zu tun ist, führen Sie eine Abfrage, die Ihnen zeigen, all die Bücher, die nicht in der Sammlung eines Benutzers. Kann ich diese Abfrage ausführen, um alle Bücher, die nicht in alle user ' s collection:
SELECT *
FROM `library`
LEFT OUTER JOIN `collection` ON `library`.`id` = `collection`.`book`
WHERE `collection`.`book` IS NULL
Das funktioniert gut soweit ich das sagen kann. Dies wird ausgeführt in PHPMyAdmin führen alle Bücher, die nicht in der collection table.
Jedoch, wie kann ich verhindern, dass einem bestimmten Benutzer? Zum Beispiel, mit den oben genannten dummy-Daten, ich will Buch 1 als Ergebnis, wenn Benutzer 2
läuft die Abfrage, und keine Bücher, wenn der Benutzer 1
führt die Abfrage aus.
Nur das hinzufügen einer AND user=[id]
funktioniert es nicht und mit meinem äußerst begrenzten wissen über JOIN
Aussagen, die ich bin nicht immer überall wirklich.
Auch, die ID der Ergebnisse zurückgegeben wird (der Abfrage angezeigt, die Sie nicht tun was ich will, aber funktioniert) 0 ist-- wie kann ich sicherstellen, dass die ID zurückgegeben wird, die von library.id
?
- bitte zeigen Sie die tatsächliche Struktur der Tabelle und geben Sie uns den Fehler (wenn überhaupt), du bist der Begegnung. Ihre Abfrage erwähnt ein Feld namens "Artikel", die nicht in der Tabelle Beschreibungen.
- UPS-- ich habe es als Artikel, wenn ich kopiert und eingefügt werden. Es sollte sein "Buch". Ich habe mich verändert die Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie verringern Sie Ihre
LEFT JOIN
Auswahl, nur Bücher, die ein bestimmter Benutzer hat, dann was istNULL
in der verknüpften Tabelle werden Zeilen(Bücher), für die der Benutzer nicht in seiner/Ihrer Sammlung:Alternative ist:
Jedoch, die erste Lösung ist, besser geeignet als MySQL ausgeführt wird, die
NOT IN
Unterabfrage einmal für jede Zeile, anstatt nur einmal für die gesamte Abfrage. Intuitiv würde man erwarten, dass MySQL zur Ausführung der Unterabfrage einmal und verwenden Sie es als eine Liste, aber MySQL ist nicht schlau genug, zu unterscheiden zwischen korrelierte und nicht-korrelierte Unterabfragen.Wie gesagt hier:
JOIN
Zeug, aus welchem Grund auch immer, ist für mich schwer zu wickeln meinem Kopf herum...IN
Unterabfragen sind erwähnt und nichtNOT IN
Unterabfragen. Also, was Sie implizieren, dass Abfragen mitNOT IN
sind nicht gut optimiert ist, ist falsch. Sehen Sie diese große blog-post: NICHT IN vs. NICHT VORHANDEN vs. LEFT JOIN / NULL IST: MySQLNOT IN
oderIN
. DieNOT
einfach inversen der boolean zurückgegeben, die vonIN
. Interessanter Artikel, obwohl +1Wie über dieses? Es ist nur aus der Spitze von meinem Kopf - ich habe keinen Zugriff auf eine Datenbank test auf der rechten Seite jetzt. (sorry)