3

我有一张桌子,看起来像:

+-----------+----------+
+ person_id + group_id +
+-----------+----------+
+    1      +    10    +
+    1      +    20    +
+    1      +    30    +
+    2      +    10    +
+    2      +    20    +
+    3      +    10    +
+-----------+----------+

我需要一个查询,以便只返回组 10 AND 20 AND 30 的 person_ids(仅 person_id: 1)。我不确定如何执行此操作,因为据我所知,这需要我按 person_id 对行进行分组,然后选择包含所有 group_id 的行。

我正在寻找可以保留键的使用而无需诉诸字符串操作group_concat()等的东西。

4

3 回答 3

5

分组和计数命中:

select person_id
  from ATable
 where group_id IN (10, 20, 30)
 group by person_id
having count(*) = 3
于 2012-04-15T23:12:50.163 回答
5

这就是你要找的:

select person_id from t
where group_id in (10, 20, 30)
group by person_id
having count(distinct group_id) = 3

虽然有效,但使用此解决方案时,值的数量in必须与您比较计数的值相匹配。

正如你所说,只是为了好玩的解决方案,即使group_concat你也可以解决这个问题:P

select person_id from t
where group_id in (10, 20, 30)
group by person_id
having group_concat(distinct group_id order by group_id) = '10,20,30'
于 2012-04-15T23:17:52.063 回答
-2
SELECT person_id FROM... WHERE group_id IN(10,20,30) group by person_id
having count(*) = 3
于 2012-04-15T23:12:01.210 回答