news 2026/6/10 4:22:45

GROUP BY进阶用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GROUP BY进阶用法

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

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

你的例子:

sql

GROUP BY wf_cur.REQUESTID, wf_cur.NODEID

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

实际示例

假设原始数据:

text

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

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

对比不同的GROUP BY方式

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

sql

GROUP BY REQUESTID, NODEID

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

2. 只按REQUESTID分组

sql

GROUP BY REQUESTID

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

text

REQUESTID names 303364 何永刚, 何永刚, 谢雨芯, 谢雨芯, 韦丹妮, 李华妹...

3. 只按NODEID分组

sql

GROUP BY NODEID

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

text

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

验证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

-- 正确:显示流程在每个节点上的处理人 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

-- 合并流程的所有处理人(不管在哪个节点) 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

-- 查看每个节点有哪些人在处理(来自不同流程) 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在不同节点确实有不同的处理人,所以显示多行是正确的。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 1:52:39

Flutter:构建高性能跨平台应用的现代框架

标题&#xff1a;Flutter&#xff1a;构建高性能跨平台应用的现代框架 引言 在移动应用开发领域&#xff0c;开发者始终面临一个核心挑战&#xff1a;如何以最少的资源和时间&#xff0c;为多个平台&#xff08;如 iOS 和 Android&#xff09;构建高质量、一致体验的应用。传统…

作者头像 李华
网站建设 2026/6/10 17:52:41

深入理解Go语言errors.As方法:灵活的错误类型识别

引言 在Go语言中&#xff0c;错误处理是一个核心话题。Go 1.13引入了新的错误处理机制&#xff0c;包括错误包裹&#xff08;error wrapping&#xff09;和几个相关的工具函数。其中errors.As函数是一个非常有用但可能被忽视的工具&#xff0c;它允许我们在错误链中查找特定类型…

作者头像 李华
网站建设 2026/6/10 17:28:18

9个AI论文工具,自考本科轻松搞定!

9个AI论文工具&#xff0c;自考本科轻松搞定&#xff01; AI 工具如何助力自考论文写作 在当前的学术环境中&#xff0c;越来越多的学生开始借助 AI 工具来提升论文写作效率。对于自考生而言&#xff0c;时间紧张、任务繁重是常态&#xff0c;而 AI 工具的出现则为他们提供了强…

作者头像 李华
网站建设 2026/6/10 17:30:10

Redis 如何应对大数据高并发访问挑战

Redis如何应对大数据高并发访问挑战&#xff1a;从原理到实践的深度解析 摘要 在电商秒杀、实时推荐、分布式缓存等高并发场景中&#xff0c;传统关系型数据库&#xff08;如MySQL&#xff09;因磁盘IO瓶颈、连接数限制等问题&#xff0c;无法满足每秒数万甚至数十万次的请求需…

作者头像 李华
网站建设 2026/6/10 17:22:16

Java线程的三种创建方式

目录 1.线程的概念 2.进程和线程的对比 3.线程创建的三种方式 1)继承Thread类 2)实现Runnable接口 3)实现Callable接口 三种方法的执行流程 1.线程的概念 线程是程序执行流的最小单位&#xff0c;是进程中的一个独立执行单元。一个进程可以包含多个线程&#xff0c;这些…

作者头像 李华
网站建设 2026/6/9 20:35:18

Off-Page SEO权威清单:构建高质量外链与品牌声誉的完整体系

什么是Off-Page SEO&#xff1f; Off-Page SEO是指在网站外部采取的行动&#xff0c;以提升网站的权威性和可信度&#xff0c;这不仅能提升品牌声誉&#xff0c;还能在传统和AI搜索中获得可见度。 一些有助于建立强大在线存在感的 Off-Page SEO 策略包括&#xff1a; 从网络上有…

作者头像 李华