Mysql 8 聚合

Posted

技术标签:

【中文标题】Mysql 8 聚合【英文标题】:Mysql 8 Aggregation 【发布时间】:2021-09-10 18:44:01 【问题描述】:

我有一个具有这种特定结构的表

在这里,我们有不同候选人执行的薮操作 (performer)。 对于每个性能,它可以是主要的或次要的(primary 列)。

每个动作可以主要只执行一次,但可以是次要的服务时间

我正在寻找的,是我为每个动作获得的结果、主要执行者的姓名和次要执行者的姓名。

这是我正在寻找的结果:

这可以仅通过 SQL 脚本来完成吗?或者我必须开发一个后端脚本(例如使用 php)来格式化数据?

【问题讨论】:

【参考方案1】:

当然,这很容易做到,像这样:

SELECT  action,
        GROUP_CONCAT(
            CASE
                WHEN T.primary = 1
                THEN performer
            END
        )                   AS  primary,
        GROUP_CONCAT(
            CASE
                WHEN T.primary = 0
                THEN performer
            END
        )                   AS  secondary
FROM    my_table
GROUP BY action

【讨论】:

每个动作只有 1 行的 primary = 1,因此不需要 GROUP_CONCAT() 。一个简单的 MAX(CASE...) 就可以了。 主要是否只能出现一次的问题并不清楚,但即便如此,我建议在使用字符串时使用 GROUP_CONCAT @forpas Yair Maron 给出的答案完成了工作。您对使用 MAX(CASE..) 有其他建议吗?谢谢大家 @beta-developper 它只是一种简化,而不是另一种解决方案:MAX(CASE WHEN T.primary = 1 THEN performer END) 而不是 GROUP_CONCAT()

以上是关于Mysql 8 聚合的主要内容,如果未能解决你的问题,请参考以下文章

26《MySQL 教程》聚合函数(聚合函数 MIN、MAX)

mysql之聚合函数

MySQL 聚合函数聚合(组合)函数概述

浅析MySQL使用 GROUP BY 分组聚合与细分聚合

MySQL聚合函数

性能调优8:分组聚合 - group by