MySQL verbindet sich mit der where-Klausel

130

Ich habe zwei Tabellen, an denen ich teilnehmen möchte.

Ich möchte alle Kategorien in der Kategorietabelle und auch alle Kategorien, die von einem Benutzer in der Tabelle category_subscriptions abonniert wurden.

Im Wesentlichen ist dies meine bisherige Frage:

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id

Dies funktioniert gut, aber ich möchte am Ende der Abfrage eine where-Klausel hinzufügen, die es dann im Wesentlichen zu einem inneren / äqui-Join macht.

   SELECT *
    FROM categories
    LEFT JOIN user_category_subscriptions 
         ON user_category_subscriptions.category_id = categories.category_id 
   WHERE user_category_subscriptions.user_id = 1

Wie erhalte ich alle Kategorien sowie alle Kategorien, die von einem bestimmten Benutzer mit nur einer Abfrage abonniert wurden?

category_id ist ein Schlüssel sowohl in der Kategorietabelle als auch in user_category_subscriptions. user_id befindet sich in der Tabelle user_category_subscriptions.

Vielen Dank

mmundiff
quelle
Ich glaube, dass es als "Right Join" bezeichnet wird, wenn ich mich nicht irre?
Tyler Carter
@ TylerCarter Sie haben sich sicherlich geirrt :)
Scooter Daraf

Antworten:

286

Sie müssen es in die joinKlausel einfügen, nicht in die where:

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions ON 
    user_category_subscriptions.category_id = categories.category_id
    and user_category_subscriptions.user_id =1

Siehe mit einem inner join, eine Klausel in das joinoder das zu setzen whereist gleichwertig. Mit einem outer joinsind sie jedoch sehr unterschiedlich.

Als joinBedingung geben Sie das Rowset an, das Sie der Tabelle hinzufügen möchten. Dies bedeutet, dass es user_id = 1zuerst ausgewertet wird und die Teilmenge von user_category_subscriptionsmit einem user_idvon verwendet 1, um mit allen Zeilen in zu verbinden categories. Dadurch erhalten Sie alle Zeilen in categories, während nur die Zeilen , die categoriesdieser bestimmte Benutzer abonniert hat, Informationen in den user_category_subscriptionsSpalten enthalten. Natürlich sind alle anderen categoriesmit bevölkert werden nullin den user_category_subscriptionsSpalten.

Umgekehrt führt eine whereKlausel den Join aus und reduziert dann das Rowset. Dies führt also alle Verknüpfungen aus und eliminiert dann alle Zeilen, in denen user_iddies nicht gleich ist 1. Sie haben einen ineffizienten Weg, um einen zu bekommen inner join.

Hoffentlich hilft das!

Eric
quelle
2
Schön gestellte Frage und schön gestellte Antwort! hat mir Zeit gespart. Vielen Dank!
Gaurav Phapale
1
Ich liebe dich so sehr Eric, dass du mich vor dem Weinen gerettet hast: D
Raheel
Wenn ich dagegen saubere Daten für Benutzer erstellen möchte, ist der zweite (wo) Weg besser geeignet. Ist es richtig ?
vlr
1
Hallo können wir user_category_subscriptions.user_id chuck ist null. Um Detail-ID in A-Tabelle abzurufen, deren ID null in B-Tabelle ist
Veeresh123
@ Veeresh123, was sind Aund BTabelle? Können Sie Ihre Frage umformulieren?
Istiaque Ahmed
11

Versuche dies

  SELECT *
    FROM categories
    LEFT JOIN user_category_subscriptions 
         ON user_category_subscriptions.category_id = categories.category_id 
   WHERE user_category_subscriptions.user_id = 1 
          or user_category_subscriptions.user_id is null
Jaffarali
quelle
Wenn ich mit diesem Code immer noch den gleichen Fehler erhalte, wonach suche ich als Nächstes?
Jack Franzen