MySQL si unisce alla clausola where

Ho due tavoli che voglio unire.

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 bene, tuttavia, voglio aggiungere una clausola where alla fine della query, che in sostanza rende un join inner / 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 particolare utente utilizzando una sola query?

category_id è una chiave in entrambe le categorie table e user_category_subscriptions. user_id residente nella tabella user_category_subscriptions.

Grazie

Devi metterlo nella clausola join , non nel 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 

Vedi, con un inner join , mettere una clausola nel join o il where è equivalente. Tuttavia, con un outer join , sono molto diversi.

Come condizione di join , si specifica il set di righe che si unirà alla tabella. Ciò significa che prima valuta user_id = 1 e prende il sottoinsieme di user_category_subscriptions con un user_category_subscriptions di 1 per unirsi a tutte le righe in categories . Questo ti darà tutte le righe in categories , mentre solo le categories cui questo particolare utente si è iscritto avranno qualsiasi informazione nelle colonne user_category_subscriptions . Naturalmente, tutte le altre categories verranno popolate con null nelle colonne user_category_subscriptions .

Al contrario, una clausola where fa il join e quindi riduce il set di righe. Quindi, questo fa tutti i join e quindi elimina tutte le righe dove user_id non è uguale a 1 . Ti rimane un modo inefficiente per ottenere un inner join .

Speriamo che questo aiuti!

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