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!