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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top