121 votes

MySQL rejoindre avec la clause where

J'ai deux tables j'ai envie de vous rejoindre.

Je veux toutes les catégories dans les catégories table et aussi de toutes les catégories souscrit par un utilisateur dans le category_subscriptions table.

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 tiens à ajouter une clause where sur la fin de la requête, qui alors en fait essentiellement un intérieur/équi-jointure.

   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 puis-je obtenir toutes les catégories ainsi que toutes les catégories souscrit par un utilisateur particulier à l'aide d'une seule requête?

category_id clé dans les deux catégories de table et user_category_subscriptions. user_id résidant dans le user_category_subscriptions table.

merci

265voto

Eric Points 35647

Vous avez besoin de le mettre dans l' join clause, pas 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, de mettre une clause dans l' join ou where est équivalent. Cependant, avec un outer join, ils sont très différents.

En tant que join condition, vous devez spécifier l'ensemble de lignes que vous vous joindrez à la table. Cela signifie qu'il évalue user_id = 1 en premier et prend le sous-ensemble de l' user_category_subscriptions avec un user_id de 1 à se joindre à toutes les lignes en categories. Cela vous donnera toutes les lignes en categories, tandis que seulement l' categories que cet utilisateur a souscrit à la volonté de toute l'information dans l' user_category_subscriptions colonnes. Bien sûr, tous les autres categories sera remplie avec null dans la user_category_subscriptions colonnes.

À l'inverse, un where clause de le rejoindre, et ensuite réduit l'ensemble de lignes. Donc, ce n'toutes les jointures, puis élimine toutes les lignes où user_id n'est pas égal à 1. Vous êtes de gauche avec un moyen inefficace pour obtenir un inner join.

Nous espérons que cette aide!

10voto

jaffarali Points 31

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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X