我有一张桌子:
----------------------
| user_id | marker_id|
----------------------
| 1 | 1 |
--------
| 1 |2 |
--------
| 2 |1 |
--------
| 2 |2 |
--------
| 2 |3 |
--------
| 3 |1 |
--------
我想得到唯一的user_id有marker_id =(1,2)。没有得到user_id的是marker_id =(1,2,3)。如何获取user_id = 1并且不包括user_id = 2.
答案 0 :(得分:1)
select distinct user_id
from table_name
where marker_id in (1,2)
答案 1 :(得分:1)
一种方法使用group by
:
select user_id
from t
group by user_id
having sum(marker_id = 1) > 0 and
sum(marker_id = 2) > 0 and
sum(marker_id not in (1, 2)) = 0;
having
子句中的每个条件都会测试其中一个值。 marker_id = 1
和> 0
的首次测试表明至少有一个。第二个类似的marker_id = 2
测试。第三个说没有其他标记ID。
我将这种类型的查询称为“set-within-sets”子查询(您正在为每个用户查找标记ID)。我发现group by
/ having
是解决这些问题的灵活方式。