Je moet het in de join . zetten clausule, niet de 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
Kijk, met een inner join , een clausule in de join . plaatsen of de where gelijkwaardig is. Echter, met een outer join , ze zijn enorm verschillend.
Als een join voorwaarde, geeft u de rijenset op die u aan de tabel wilt toevoegen. Dit betekent dat het user_id = 1 . evalueert eerst, en neemt de subset van user_category_subscriptions met een user_id van 1 om lid te worden van alle rijen in categories . Dit geeft je alle rijen in categories , terwijl alleen de categories waarop deze specifieke gebruiker zich heeft geabonneerd, heeft alle informatie in de user_category_subscriptions kolommen. Natuurlijk, alle andere categories wordt gevuld met null in de user_category_subscriptions kolommen.
Omgekeerd, een where clausule doet de join, en dan vermindert de rijenset. Dit doet dus alle joins en elimineert vervolgens alle rijen waar user_id is niet gelijk aan 1 . Je hebt een inefficiënte manier om een inner join te krijgen .
Hopelijk helpt dit!