Vous devez le mettre dans le join clause, pas la 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
Voir, avec une inner join , en mettant une clause dans le join ou le where est équivalent. Cependant, avec une outer join , ils sont très différents.
En tant que join condition, vous spécifiez l'ensemble de lignes que vous allez joindre à la table. Cela signifie qu'il évalue user_id = 1 d'abord, et prend le sous-ensemble de user_category_subscriptions avec un user_id de 1 pour joindre toutes les lignes des categories . Cela vous donnera toutes les lignes dans categories , alors que seules les categories auquel cet utilisateur particulier s'est abonné aura des informations dans le user_category_subscriptions Colonnes. Bien sûr, toutes les autres categories sera rempli avec null dans les user_category_subscriptions colonnes.
Inversement, un where la clause fait la jointure, et alors réduit l'ensemble de lignes. Donc, cela fait toutes les jointures, puis élimine toutes les lignes où user_id n'est pas égal à 1 . Il vous reste un moyen inefficace d'obtenir une inner join .
J'espère que cela vous aidera !