it-swarm.com.de

MySQL tritt der where-Klausel bei

Ich habe zwei Tische, 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 Frage bisher:

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

Dies funktioniert einwandfrei, ich möchte jedoch eine where-Klausel am Ende der Abfrage einfügen, die es dann im Wesentlichen zu einem inner/equi-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 von einem bestimmten Benutzer abonnierten Kategorien mit nur einer Abfrage?

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

vielen Dank

119
mmundiff

Sie müssen es in die join -Klausel 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 Ist das Einfügen einer Klausel in das join oder das where äquivalent. Mit einem outer join Sind sie jedoch sehr unterschiedlich.

Als join-Bedingung geben Sie das Rowset an, das Sie der Tabelle hinzufügen möchten. Dies bedeutet, dass zuerst user_id = 1 Ausgewertet und die Teilmenge von user_category_subscriptions Mit einem user_id Von 1 Als Verbindung zu allen Zeilen in categories. Dadurch erhalten Sie alle Zeilen in categories, während nur die categories, die dieser bestimmte Benutzer abonniert hat, Informationen in den Spalten user_category_subscriptions Enthalten. Natürlich werden alle anderen categories mit null in den Spalten user_category_subscriptions Gefüllt.

Umgekehrt führt eine where -Klausel den Join aus, und then reduziert das Rowset. Dies führt also alle Verknüpfungen aus und entfernt dann alle Zeilen, bei denen user_id Nicht gleich 1 Ist. Sie haben eine ineffiziente Möglichkeit, einen inner join Zu erhalten.

Hoffentlich hilft das!

259
Eric

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
10
jaffarali