Jointure MySQL avec clause where

130

J'ai deux tables que je veux rejoindre.

Je veux toutes les catégories du tableau des catégories ainsi que toutes les catégories auxquelles un utilisateur a souscrit dans le tableau category_subscriptions.

essentiellement, c'est ma requête jusqu'à présent:

SELECT *
FROM categories
LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id

Cela fonctionne bien, mais je souhaite ajouter une clause where à la fin de la requête, ce qui en fait essentiellement une jointure interne / 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

Comment obtenir toutes les catégories ainsi que toutes les catégories auxquelles un utilisateur est abonné en utilisant une seule requête?

category_id étant une clé dans la table des catégories et dans les abonnements user_category_subscriptions. user_id résidant dans la table user_category_subscriptions.

Merci

mmundiff
la source
Je crois que cela s'appelle une «jointure droite» si je ne me trompe pas?
Tyler Carter
@TylerCarter vous vous trompez sûrement :)
Scooter Daraf

Réponses:

287

Vous devez le mettre dans la joinclause, pas dans le 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

Voir, avec un inner join, mettre une clause dans le joinou le whereest équivalent. Cependant, avec un outer join, ils sont très différents.

Comme joincondition, vous spécifiez l'ensemble de lignes que vous joindrez à la table. Cela signifie qu'il évalue en user_id = 1premier et prend le sous-ensemble de user_category_subscriptionsavec un user_idsur 1pour joindre toutes les lignes dans categories. Cela vous donnera toutes les lignes dans categories, tandis que seul celui categoriesauquel cet utilisateur particulier s'est abonné aura des informations dans les user_category_subscriptionscolonnes. Bien sûr, tous les autres categoriesseront renseignés nulldans les user_category_subscriptionscolonnes.

Inversement, une whereclause effectue la jointure, puis réduit l'ensemble de lignes. Donc, cela fait toutes les jointures, puis élimine toutes les lignes où user_idn'est pas égal 1. Il vous reste un moyen inefficace d'obtenir un fichier inner join.

Espérons que cela aide!

Eric
la source
2
Question joliment posée et réponse joliment posée! a sauvé mon temps. Merci beaucoup!
Gaurav Phapale
1
Je t'aime tellement Eric tu m'as sauvé de pleurer: D
Raheel
D'un autre côté, si je veux produire des données propres pour les utilisateurs, la deuxième méthode (où) est plus appropriée. Est-ce correct ?
vlr
1
Salut, pouvons-nous chuck user_category_subscriptions.user_id est nul. Afin de récupérer l'ID de détail dans la table A qui a l'ID nul dans la table B
Veeresh123
@ Veeresh123, que sont Aet Btable? Pouvez-vous reformuler votre question?
Istiaque Ahmed
11

Essaye ça

  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
Jaffarali
la source
Si j'obtiens toujours la même erreur en utilisant ce code, que dois-je rechercher ensuite.
Jack Franzen du