Трябва да го поставите в join клауза, а не 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
Вижте, с inner join , поставяйки клауза в join или where е еквивалентен. Въпреки това, с outer join , те са много различни.
Като join условие, вие посочвате набора от редове, който ще присъедините към таблицата. Това означава, че оценява user_id = 1 първо и приема подмножеството от user_category_subscriptions с user_id от 1 за да се присъедините към всички редове в categories . Това ще ви даде всички редове в categories , докато само categories за които този конкретен потребител се е абонирал, ще има всякаква информация в user_category_subscriptions колони. Разбира се, всички останали categories ще бъде попълнен с null в user_category_subscriptions колони.
Обратно, where клауза извършва присъединяването, а след това намалява набора от редове. Така че, това прави всички присъединявания и след това елиминира всички редове, където user_id не е равно на 1 . Остава ви неефективен начин да получите inner join .
Дано това помогне!