GROUP BY进阶用法

问题重新:

sql语句中使用了GROUP BY wf_cur.REQUESTID, wf_cur.NODEID,为什么还会出用两行相同REQUESTID的记录呢,GROUP BY不就是拿某个字段来分组吗?

GROUP BY 是按你指定的字段组合进行分组的,不是按单个字段。

你的例子:

sql

vbnet 复制代码
GROUP BY wf_cur.REQUESTID, wf_cur.NODEID

这意味着:只有 REQUESTID 和 NODEID 都相同的记录才会被分到同一组

实际示例

假设原始数据:

text

yaml 复制代码
REQUESTID  NODEID  USERID  LASTNAME
1001       10      1       张三
1001       10      2       李四    <- 同一组(REQUESTID和NODEID都相同)
1001       20      3       王五    <- 不同组(NODEID不同)
1001       20      4       赵六    <- 同一组
1002       10      5       钱七    <- 不同组(REQUESTID不同)

分组结果:

  1. 组1:REQUESTID=1001, NODEID=10

    • 包含:张三、李四
    • GROUP_CONCAT结果:"张三, 李四"
  2. 组2:REQUESTID=1001, NODEID=20

    • 包含:王五、赵六
    • GROUP_CONCAT结果:"王五, 赵六"
  3. 组3:REQUESTID=1002, NODEID=10

    • 包含:钱七
    • GROUP_CONCAT结果:"钱七"

为什么会出现多行相同REQUESTID?

因为同一个REQUESTID可能有不同的NODEID!

在你的工作流系统中:

  • 一个流程(REQUESTID)会经过多个节点(NODEID)
  • 每个节点可能有不同的处理人
  • 所以同一个REQUESTID会出现在多个不同的节点中

你的数据示例:

text

复制代码
REQUESTID  NODEID  处理人
303364     371     何永刚
303364     372     何永刚, 谢雨芯  <- 节点372
303364     374     韦丹妮, 谢雨芯  <- 节点374(不同节点!)
303364     377     李华妹         <- 节点377(不同节点!)

GROUP BY REQUESTID, NODEID 后,每个(REQUESTID, NODEID)组合成为一行:

text

r 复制代码
REQUESTID  NODEID  names
303364     371     何永刚
303364     372     何永刚, 谢雨芯
303364     374     韦丹妮, 谢雨芯
303364     377     李华妹

对比不同的GROUP BY方式

1. 按REQUESTID和NODEID分组(你的方式)

sql

vbnet 复制代码
GROUP BY REQUESTID, NODEID

结果:一个REQUESTID在不同节点会有多行记录

2. 只按REQUESTID分组

sql

vbnet 复制代码
GROUP BY REQUESTID

结果:一个REQUESTID只有一行记录,合并所有节点的人员

text

r 复制代码
REQUESTID  names
303364     何永刚, 何永刚, 谢雨芯, 谢雨芯, 韦丹妮, 李华妹...

3. 只按NODEID分组

sql

vbnet 复制代码
GROUP BY NODEID

结果:同一个节点来自不同流程的人员合并

text

scss 复制代码
NODEID  names
372     何永刚(303364), 谢雨芯(303364), 张三(其他流程), 李四(其他流程)...

验证SQL

运行这个来查看实际的分组情况:

sql

sql 复制代码
-- 查看每个REQUESTID有多少个不同的NODEID
SELECT 
    REQUESTID,
    COUNT(DISTINCT NODEID) AS node_count,
    GROUP_CONCAT(DISTINCT NODEID ORDER BY NODEID) AS node_list,
    COUNT(DISTINCT USERID) AS user_count
FROM workflow_currentoperator
WHERE ISREMARK IN (0, 4)
    AND REQUESTID IN ('303364', '303365', '303366')  -- 你的示例REQUESTID
GROUP BY REQUESTID
ORDER BY REQUESTID;

根据需求选择正确的GROUP BY

场景1:想要每个流程每个节点的处理人列表(你现在的需求)

sql

vbnet 复制代码
-- 正确:显示流程在每个节点上的处理人
SELECT
    REQUESTID,
    NODEID,
    GROUP_CONCAT(DISTINCT LASTNAME ORDER BY LASTNAME SEPARATOR ', ') AS node_handlers
FROM workflow_currentoperator wf_cur
INNER JOIN hrmresource zper ON wf_cur.USERID = zper.ID
WHERE wf_cur.ISREMARK IN (0, 4)
GROUP BY REQUESTID, NODEID;

场景2:想要每个流程的所有处理人(合并所有节点)

sql

vbnet 复制代码
-- 合并流程的所有处理人(不管在哪个节点)
SELECT
    REQUESTID,
    GROUP_CONCAT(DISTINCT LASTNAME ORDER BY LASTNAME SEPARATOR ', ') AS all_handlers,
    COUNT(DISTINCT NODEID) AS total_nodes
FROM workflow_currentoperator wf_cur
INNER JOIN hrmresource zper ON wf_cur.USERID = zper.ID
WHERE wf_cur.ISREMARK IN (0, 4)
GROUP BY REQUESTID;

场景3:想要每个节点的所有处理人(合并所有流程)

sql

vbnet 复制代码
-- 查看每个节点有哪些人在处理(来自不同流程)
SELECT
    NODEID,
    GROUP_CONCAT(
        DISTINCT CONCAT(LASTNAME, '(', REQUESTID, ')')
        ORDER BY LASTNAME
        SEPARATOR ', '
    ) AS handlers_by_process,
    COUNT(DISTINCT REQUESTID) AS process_count
FROM workflow_currentoperator wf_cur
INNER JOIN hrmresource zper ON wf_cur.USERID = zper.ID
WHERE wf_cur.ISREMARK IN (0, 4)
GROUP BY NODEID;

总结

GROUP BY REQUESTID, NODEID 的结果是正常的!

  • 同一个REQUESTID + 不同的NODEID = 不同的分组
  • 这反映了工作流的真实情况:一个流程会经过多个节点
  • 每个节点可能有不同的处理人

如果你想要每个REQUESTID只显示一行 ,应该用 GROUP BY REQUESTID

但根据你的数据,同一个REQUESTID在不同节点确实有不同的处理人,所以显示多行是正确的。

相关推荐
李慕婉学姐2 小时前
【开题答辩过程】以《基于Android的健康助手APP的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
android·java·mysql
qq_12498707532 小时前
基于springboot健康养老APP的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·mysql·微信小程序·毕业设计
亚林瓜子3 小时前
mysql命令行手动导入csv数据到指定表
数据库·mysql·gui·csv·cli·db·import
一分半心动3 小时前
lnmp架构 mysql数据库Cannot assign requested address报错解决
linux·mysql·php
ChristXlx3 小时前
Linux安装mysql(虚拟机适用)
linux·mysql
瀚高PG实验室4 小时前
timestampdiff (MYSQL)函数在Highgo DB中的写法
数据库·mysql·瀚高数据库
还是鼠鼠4 小时前
SQL语句执行很慢,如何分析呢?
java·数据库·mysql·面试
云和数据.ChenGuang5 小时前
批量给100台服务器装系统,还要完成后续的配置和软件部署
运维·服务器·开发语言·mysql
程序员卷卷狗5 小时前
为什么MySQL默认使用可重复读RR?深入解析binlog与隔离级别的关系
数据库·mysql