2009-09-01 7 views
0

J'ai deux tables:MySQL Sélection de lignes Linked

Tableau "A":

+----------+ 
| item_id | 
+----------+ 
| 10  | 
| 20  | 
| 30  | 
| 40  | 
+----------+ 

et une table "B":

+----------+-------------+ 
| item_id | user_id | 
+----------+-------------+ 
| 10  | 1   | 
| 10  | 2   | 
| 20  | 1   | 
| 30  | 2   | 
+----------+-------------+ 

le champ "item_id" est un champ commun .

Si je souhaite sélectionner toutes les lignes de la table A où les deux utilisateurs 1 et 2 existent (mais pas les lignes où un seul des deux existe), comment pourrais-je obtenir cette requête? (Je cherche à avoir une ligne dans le résultat où item_id est 10).

Répondre

4

Essayez ceci:

SELECT a.item_id 
    FROM TABLE_A a 
    JOIN TABLE_B b ON b.item_id = a.item_id 
    WHERE b.user_id IN (1, 2) 
GROUP BY a.item_id 
    HAVING COUNT(*) = 2 
+0

Serait-ce plus rapide ou plus lent que l'autre exemple de joindre la table B sur elle-même plusieurs fois si les tables sont grandes? (à condition que les tables aient des index appropriés) – Ian

0
select item_id from table_b where user_id = 1 
intersect 
select item_id from table_b where user_id = 2 
+0

est-il INTERSECT dans mysql? –

2

Une autre alternative:

SELECT A.* 
FROM tableA A 
INNER JOIN tableB B1 ON B1.item_id = A.item_id AND B1.user_id = 1 
INNER JOIN tableB B2 ON B2.item_id = A.item_id AND B2.user_id = 2 

Rejoint A à B deux fois, une fois pour un utilisateur, encore une fois pour l'autre utilisateur. C'est une autre façon d'indiquer une auto-jointure de B à lui-même pour trouver les objets avec les deux utilisateurs.

Cela ne devrait pas s'étendre bien au-delà de deux utilisateurs (chacun nécessite une jointure supplémentaire).

0
SELECT a.item_id FROM a 
    INNER JOIN b x ON a.item_id = x.item_id 
    INNER JOIN b y ON x.item_id = y.item_id 
     AND x.user_id = 1 AND y.user_id = 2; 
Questions connexes