Question

Je souhaite rejoindre deux tables.

Je veux toutes les catégories de la table des catégories, ainsi que toutes les catégories auxquelles un utilisateur a souscrit dans la table category_subscriptions.

Essentiellement, voici ma question:

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 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

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

category_id étant une clé dans la table des catégories et dans les catégories d'utilisateurs_catégorie. user_id résidant dans la table user_category_subscriptions.

merci

Était-ce utile?

La solution

Vous devez l'insérer dans la clause join , pas dans le :

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 une jointure interne , l'insertion d'une clause dans la balise join ou le est équivalent. Cependant, avec une jointure externe , ils sont très différents.

En tant que condition join , vous spécifiez le jeu de lignes que vous joindrez à la table. Cela signifie qu’il évalue d’abord user_id = 1 et prend le sous-ensemble de abonnements_catégorie_utilisateur avec un id_utilisateur de 1 à rejoindre à toutes les lignes de catégories . Cela vous donnera toutes les lignes de catégories , alors que seules les catégories auxquelles cet utilisateur particulier s'est abonné auront des informations dans le user_category_subscriptions colonnes. Bien entendu, toutes les autres catégories seront renseignées avec null dans les colonnes user_category_subscriptions .

Inversement, une clause effectue la jointure et then réduit l'ensemble de lignes. Ainsi, toutes les jointures sont éliminées, puis toutes les lignes où id_utilisateur n'est pas égal à 1 sont supprimées. Il vous reste un moyen inefficace d'obtenir une jointure interne .

J'espère que cela aide!

Autres conseils

Essayez ceci

  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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top