Sie müssen es in join einfügen -Klausel, nicht das 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 , indem Sie eine Klausel in join einfügen oder das where ist gleichwertig. Allerdings mit einem outer join , sie sind sehr unterschiedlich.
Als join Bedingung geben Sie das Rowset an, das Sie mit der Tabelle verknüpfen möchten. Das bedeutet, dass es user_id = 1 auswertet zuerst und nimmt die Teilmenge von user_category_subscriptions mit einer user_id von 1 um alle Zeilen in categories zu verbinden . Dadurch erhalten Sie alle Zeilen in categories , während nur die categories die dieser bestimmte Benutzer abonniert hat, enthält alle Informationen in user_category_subscriptions Säulen. Natürlich auch alle anderen categories wird mit null gefüllt in den user_category_subscriptions Spalten.
Umgekehrt ein where -Klausel führt den Join aus, und then reduziert das Rowset. Dies führt also alle Verknüpfungen durch und eliminiert dann alle Zeilen, in denen user_id ist nicht gleich 1 . Sie haben nur noch einen ineffizienten Weg, um einen inner join zu erhalten .
Hoffentlich hilft das!