选择成员年龄均在X以下的GROUP

时间:2019-05-04 05:56:31

标签: mysql sql

举例来说,我正在尝试选择一个其所有成员都在一定年龄以下的人群。

如果我有一个这样的表:

name | group | age
andy | 1     | 15
lisa | 1     | 16
matt | 2     | 24
...  | 3     | 15
...  | 3     | 26

选择成员年龄都在17岁或以下的组将返回组1。

我尝试使用GROUP BY ... HAVING ...子句,但是由于第3组的成员年龄为15岁,因此返回了第1组和第3组。

2 个答案:

答案 0 :(得分:2)

基本上,您需要统计每个组的成员,还必须统计17岁以下的成员的数量。对于所有成员都在17岁以下的组,这些计数将相同。在MySQL中,您可以使用SUM(age <= 17)进行后者,因为MySQL在数字上下文中将布尔值视为1或0:

SELECT `group`
FROM groups
GROUP BY `group`
HAVING COUNT(*) = SUM(age <= 17)

输出

group
1

Demo on dbfiddle

答案 1 :(得分:1)

我会通过查看最大年龄来做到这一点:

SELECT `group`
FROM groups
GROUP BY `group`
HAVING MAX(age) <= 17;

注意:这假设age从未为NULL。如果有这种可能,则应解释要处理NULL值的逻辑。

我还应该注意,在大多数情况下,您会有单独的分组表。如果真是这样,那么not exists可能是最有效的解决方案:

select g.*
from groups g
where not exists (select 1
                  from groupmembers gm
                  where gm.groupid = g.groupid and
                        gm.age > 17
                 );

这具有使所有满足您所陈述条件的组,甚至没有成员的组的优势。