MySQL si unisce alla clausola where
-
10-07-2019 - |
Domanda
Ho due tabelle a cui voglio unirmi.
Voglio tutte le categorie nella tabella delle categorie e anche tutte le categorie sottoscritte da un utente nella tabella category_subscriptions.
essenzialmente questa è la mia domanda finora:
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id
Funziona benissimo, tuttavia voglio aggiungere una clausola where alla fine della query che poi la rende essenzialmente un join interno / equi.
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id
WHERE user_category_subscriptions.user_id = 1
Come posso ottenere tutte le categorie e tutte le categorie sottoscritte da un determinato utente usando una sola query?
category_id è una chiave in entrambe le tabelle delle categorie e user_category_subscriptions. id_utente che risiede nella tabella user_category_subscriptions.
grazie
Soluzione
Devi inserirlo nella clausola join
, non nel dove
:
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions ON
user_category_subscriptions.category_id = categories.category_id
and user_category_subscriptions.user_id =1
Vedi, con un join interno
, inserendo una clausola nel join
o nel dove
è equivalente. Tuttavia, con un join esterno
, sono molto diversi.
Come condizione join
, si specifica il set di righe che verrà unito alla tabella. Ciò significa che valuta prima user_id = 1
e accetta il sottoinsieme di user_category_subscriptions
con un user_id
di 1
su unisciti a tutte le righe in categorie
. Questo ti darà tutte le righe in categorie
, mentre solo le categorie
a cui questo particolare utente ha sottoscritto avranno tutte le informazioni in user_category_subscriptions
colonne. Naturalmente, tutte le altre categorie
saranno popolate con null
nelle colonne user_category_subscriptions
.
Al contrario, una clausola dove
fa il join e quindi riduce il set di righe. Quindi, questo fa tutti i join e quindi elimina tutte le righe in cui user_id
non è uguale a 1
. Ti resta un modo inefficiente per ottenere un join interno
.
Speriamo che questo aiuti!
Altri suggerimenti
Prova questo
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id
WHERE user_category_subscriptions.user_id = 1
or user_category_subscriptions.user_id is null