Frage

Ich habe zwei Tabellen I anschließen möchten.

Ich möchte alle Kategorien in der Tabelle Kategorien und auch alle der durch einen Benutzer in der Tabelle category_subscriptions abonnierten Kategorien.

im Wesentlichen das ist meine Abfrage so weit:

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

Das funktioniert gut, aber ich mag eine where-Klausel am Ende der Abfrage hinzufügen, die dann macht es im wesentlichen ein inneres / equi verbinden.

   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 kann ich alle Kategorien erhalten sowie alle durch eine einzige Abfrage mit bestimmten Benutzer abonniert Kategorien?

category_id ein Schlüssel in der Tabelle beiden Kategorien und mehr user_category_subscriptions. User_ID in der user_category_subscriptions Tabelle befindet.

Dank

War es hilfreich?

Lösung

Sie müssen es in der join Klausel setzen, nicht 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

Sehen Sie, mit einem inner join, eine Klausel in den join setzen oder die where entspricht. Doch mit einem outer join, sind sie ganz anders.

Als join Bedingung, können Sie die rowset angeben, die Sie an den Tisch beitreten werden. Dies bedeutet, dass es wertet user_id = 1 zuerst, und nimmt die Teilmenge von user_category_subscriptions mit einem user_id von 1 auf alle Zeilen in categories beizutreten. Dadurch erhalten Sie alle Zeilen in categories, während nur die categories, dass diese bestimmten Benutzer keine Informationen in den Spalten user_category_subscriptions abonniert hat müssen. Natürlich werden alle anderen categories mit null in den user_category_subscriptions Spalten aufgefüllt werden.

Im Gegensatz dazu eine where-Klausel Join und und reduziert die rowset. So hat das alles der Joins und eliminiert dann alle Zeilen, in denen user_id nicht gleich 1 tut. Sie sind mit einem ineffizienten Weg links, um einen inner join zu erhalten.

Wir hoffen, das hilft!

Andere Tipps

Versuchen Sie, diese

  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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top