MySQL rejoindre avec la clause where
-
10-07-2019 - |
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
La solution
Vous devez l'insérer dans la clause join
, pas dans le où
:
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 où
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 où
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