我想使用item_id = 100 AND item_id = 200获取所有不同的user_id。在这种情况下,正确的结果是1.但在这个简化的情况下,我的SQL查询将如何? 表:
user_id item_id
1 100
1 200
3 100
答案 0 :(得分:3)
使用条件聚合:
SELECT user_id
FROM yourTable
WHERE item_id IN (100, 200)
GROUP BY user_id
HAVING COUNT(DISTINCT item_id) = 2;
这个技巧首先限制只对应于你感兴趣的两个项目的记录,然后它断言匹配的用户有一个不同的项目数量为2,这意味着他符合标准。
有时逻辑需要以稍微不同的方式执行此操作:
SELECT user_id
FROM yourTable
GROUP BY user_id
HAVING
SUM(CASE WHEN item_id = 100 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN item_id = 200 THEN 1 ELSE 0 END) > 0;
这种形式在某些情况下可能更有用,但它也会做同样的事情。
答案 1 :(得分:2)
DROP TABLE IF EXISTS T;
CREATE table t(user_id int, item_id int);
insert into t values
(1 , 100),
(1 , 200),
(3 , 100);
select user_id
from t
where item_id in (100, 200)
group by user_id having count(distinct item_id) = 2;
+---------+
| user_id |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
答案 2 :(得分:1)
您可以使用自联接(直观地更容易理解):
SELECT DISTINCT(t1.user_id)
FROM table_name AS t1 inner join table_name AS t2
ON t1.user_id=t2.user_id
WHERE t1.item_id=100 and t2.item_id=200;