J'ai trois tables dans une base de données MySQL. La première table contient des utilisateurs et la seconde table contient des éléments. Vous trouverez ci-dessous la structure de ces deux éléments.
users ------ userid (int) username (varchar) items ------ itemid (int) name (varchar)
La troisième table est la table de jointure.
user_items ---------- userid (int) itemid (int)
Je veux une requête qui renvoie une liste des utilisateurs et des projets qui ne leur sont pas attribués.
Dans l'exemple J'ai les utilisateurs suivants
userid username 1 john 2 tim 3 mark
J'ai également les articles suivants
itemid name 1 book 2 pen 3 backpack
Dans ma table de jointure
userid itemid 1 1 1 3 2 1 2 2 2 3 3 2
Je souhaite donc obtenir une liste des éléments qui n'appartiennent pas à l'utilisateur, par exemple :
userid itemid 1 2 3 1 3 3
Quelle est la meilleure requête pour obtenir des résultats comme celui-ci. J'essaie des jointures gauches, des jointures externes gauches, des jointures gauches, etc. sans succès.
Modification 1 : Jusqu'à présent, j'ai essayé les requêtes suivantes :
SELECT con.userid, i.itemid FROM items i LEFT JOIN ( SELECT u.id as userid, ui.itemid FROM users u INNER JOIN user_items ui ON u.userid = ui.itemid ) con ON i.itemid = con.itemid WHERE con.itemid IS NULL
Vous devez généralement
交叉联接
utilisateurs et produits pour générer toutes les combinaisons possibles, puis filtrer les associations qui existent déjà dans la table de pont :Pour améliorer les performances, il faut
user_items(userid, itemid)
上的索引(如果您对这些列有唯一
des contraintes, qui devraient déjà exister). p>On peut aussi utiliser l'inverse
左连接
pour exprimer la logique :