举例来说,我正在尝试选择一个其所有成员都在一定年龄以下的人群。
如果我有一个这样的表:
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组。
答案 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
答案 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
);
这具有使所有满足您所陈述条件的组,甚至没有成员的组的优势。