我有两张桌子:
表“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)。
答案 0 :(得分: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
答案 1 :(得分: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到自身的自我联接的方式,以便与两个用户一起找到项目。
这不会超出两个用户(每个用户都需要额外的连接)。
答案 2 :(得分:0)
select item_id from table_b where user_id = 1
intersect
select item_id from table_b where user_id = 2
答案 3 :(得分: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;