2009-09-01 32 views
0

我有两个表:MySQL的选择链接的行

表 “A”:

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

和表 “B”:

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

字段 “ITEM_ID” 是一种常见的场。

如果我希望选择表A中存在用户1和用户2的所有行(但不是只存在其中一个存在的行),那么如何构建此查询? (我期待在item_id为10的结果中有一行)。

回答

4

尝试这种情况:

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

如果表格很大,这会比多次连接表B的其他示例快或慢吗? (提供的表有适当的索引) – Ian

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

是否存在INTERSECT在MySQL? –

2

另一种替代方法:

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 

加入A至一个用户的其他用户B两次,一次,一次。这是另一种说明从B到自身的自联接的方式,以便与两个用户一起查找项目。

这不会超出两个用户(每个用户需要额外的连接)。

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;