MySQL si unisce alla clausola where


130

Ho due tavoli 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. user_id residente nella tabella user_category_subscriptions.

Grazie


Credo che si chiama 'Right Join' se non sbaglio?
Tyler Carter,

@TylerCarter hai sicuramente sbagliato :)
Scooter Daraf,

Risposte:


287

Devi inserirlo nella joinclausola, non in 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, inserendo una clausola in joino the whereè equivalente. Tuttavia, con un outer join, sono molto diversi.

Come joincondizione, si specifica il set di righe che verrà unito alla tabella. Ciò significa che valuta user_id = 1prima e accetta il sottoinsieme di user_category_subscriptionscon un user_iddi 1per unirsi a tutte le righe in categories. Questo ti darà tutte le righe categories, mentre solo le informazioni a categoriescui questo particolare utente si è abbonato avranno informazioni nelle user_category_subscriptionscolonne. Naturalmente, tutti gli altri categoriessaranno popolati con nullnelle user_category_subscriptionscolonne.

Al contrario, una whereclausola fa l'unione e quindi riduce il set di righe. Quindi, questo fa tutti i join e quindi elimina tutte le righe dove user_idnon è uguale 1. Ti resta un modo inefficiente per ottenerne uno inner join.

Speriamo che questo aiuti!


2
Metti bene la domanda e ben rispondi! mi ha salvato il tempo. molte grazie!
Gaurav Phapale,

1
Ti amo così tanto Eric che mi hai salvato dal pianto: D
Raheel

D'altra parte, se voglio produrre dati puliti per gli utenti, il secondo (dove) modo è più appropriato. È corretto ?
vlr,

1
Salve, possiamo inserire user_category_subscriptions.user_id è nullo. Per recuperare l'id di dettaglio in una tabella che ha id null nella tabella B
Veeresh123,

@ Veeresh123, cosa sono Ae Btabella? Puoi riformulare la tua domanda?
Istiaque Ahmed,

11

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

Se sto ancora riscontrando lo stesso errore usando questo codice, cosa cercherò dopo.
Jack Franzen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.