问题重新:
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:REQUESTID=1001, NODEID=10
- 包含:张三、李四
- GROUP_CONCAT结果:"张三, 李四"
-
组2:REQUESTID=1001, NODEID=20
- 包含:王五、赵六
- GROUP_CONCAT结果:"王五, 赵六"
-
组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在不同节点确实有不同的处理人,所以显示多行是正确的。