Musisz umieścić go w join klauzula, a nie 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
Zobacz, z inner join , umieszczając klauzulę w join lub where jest równoważne. Jednak z outer join , są one bardzo różne.
Jako join warunek, określ zestaw wierszy, który będzie dołączany do tabeli. Oznacza to, że oblicza user_id = 1 najpierw i pobiera podzbiór user_category_subscriptions z user_id z 1 dołączyć do wszystkich wierszy w categories . To da ci wszystkie wiersze w categories , podczas gdy tylko categories że ten konkretny użytkownik zasubskrybował, będzie miał wszelkie informacje w user_category_subscriptions kolumny. Oczywiście wszystkie inne categories zostanie wypełnione null w user_category_subscriptions kolumny.
I odwrotnie, where klauzula łączy, a wtedy zmniejsza zestaw wierszy. W ten sposób wykonuje wszystkie połączenia, a następnie eliminuje wszystkie wiersze, w których user_id nie równa się 1 . Pozostaje Ci niewydajny sposób na uzyskanie inner join .
Mam nadzieję, że to pomoże!