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在不同节点确实有不同的处理人,所以显示多行是正确的。

相关推荐
麦聪聊数据5 小时前
MySQL并发与锁:从“防止超卖”到排查“死锁”
数据库·sql·mysql
myzshare7 小时前
实战分享:我是如何用SSM框架开发出一个完整项目的
java·mysql·spring cloud·微信小程序
辞砚技术录8 小时前
MySQL面试题——索引2nd
数据库·mysql·面试
墨笔之风8 小时前
java后端根据双数据源进行不同的接口查询
java·开发语言·mysql·postgres
黑白极客9 小时前
怎么给字符串字段加索引?日志系统 一条更新语句是怎么执行的
java·数据库·sql·mysql·引擎
哈里谢顿10 小时前
小探mysql覆盖索引
mysql
X***078810 小时前
理解 MySQL 的索引设计逻辑:从数据结构到实际查询性能的系统分析
数据库·mysql·sqlite
warton8810 小时前
ubuntu24 安装 proxsql 实现数据库代理
linux·运维·mysql·ubuntu
天意pt10 小时前
Blog-SSR 系统操作手册(v1.0.0)
前端·vue.js·redis·mysql·docker·node.js·express
麦麦大数据11 小时前
J009 美食推荐可视化大数据系统vue+springboot
vue.js·spring boot·mysql·推荐算法·美食·可视化分析·沙箱支付