MySQL verbinden mit where-Klausel
-
10-07-2019 - |
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
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