【问题标题】:Selecting GROUP whose MEMBERS are all aged under X选择其成员年龄均在 X 岁以下的 GROUP
【发布时间】:2019-09-22 14:19:09
【问题描述】:

例如,我试图选择一个组,其中所有成员的年龄都在特定年龄以下。

如果我有这样一张桌子:

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

选择成员全部为 17 岁或以下的组将返回组 1。

我尝试使用 GROUP BY... HAVING... 子句,但返回第 1 组和第 3 组,因为第 3 组有一个 15 岁的成员。

【问题讨论】:

  • 也许你在找什么地方?

标签: mysql sql


【解决方案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
                 );

这样做的好处是可以让所有满足您陈述的条件的组,即使是没有成员的组。

【讨论】:

    【解决方案2】:

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

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

    输出

    group
    1
    

    Demo on dbfiddle

    【讨论】:

    • @BarbarosÖzhan 感谢我误读了问题的编辑。
    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    相关资源
    最近更新 更多