Трябва да го поставите в 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
.
Дано това помогне!