用 2 个带条件的表对 concat 进行分组

Posted

技术标签:

【中文标题】用 2 个带条件的表对 concat 进行分组【英文标题】:Group concat with 2 tables with conditions 【发布时间】:2021-09-29 21:30:10 【问题描述】:

我遇到了这个 mysql 语句的 concat 问题。数据如下所示:

> ID: 60abae122046b578881656e1, User: Admin, Server: localhost.local 
> ID: 60abae122046b578881656e1, User: Admin, Server: Test Device
> ID: 60aed69a89eb406cd6eaaf89, User: Steve Madden, Server: wpdesktop01
> ID: 60d09c2990d1887919cc8aff, User: Stu Hope, Server: pf-us1-smd
> ID: 60d09c2990d1887919cc8aff, User: Stu Hope, Server: pfv-us1-smd
> ID: 5d826b16827c0805683af8f5, User: test, Server: pf-us1-ansible
> ID: 5d826b16827c0805683af8f5, User: test, Server: pf-us1-dmz-sftp
> ID: 5c9b585c235ec76b0161c648, User: Rodrigo, Server: pf-us1-dev
> ID: 5c9b585c235ec76b0161c648, User: Rodrigo, Server: pf-us1-ansible
> ID: 5c9b585c235ec76b0161c648, User: Rodrigo, Server: pf-us1-zabbix
> ID: 5c9b585c235ec76b0161c648, User: Rodrigo, Server: pf-us1-sm

我们的想法是让它看起来像这样:

> ID: 60abae122046b578881656e1, User: Admin, Server: localhost.local, Test Device
> ID: 60aed69a89eb406cd6eaaf89, User: Steve Madden, Server: wpdesktop01
> ID: 60d09c2990d1887919cc8aff, User: Stu Hope, Server: pf-us1-smd, pfv-us1-smd
> ID: 5d826b16827c0805683af8f5, User: test, Server: pf-us1-ansible, pf-us1-dmz-sftp
> ID: 5c9b585c235ec76b0161c648, User: Rodrigo, Server: pf-us1-dev, pf-us1-ansible, pf-us1-zabbix, pf-us1-sm

我现在的陈述是这样的:

$sql_modal = 'SELECT 
  pf_jc_user_audit.jc_id,
  pf_jc_user_audit.jc_user,
  pf_jc_user_server_ass.system_id,
  pf_jc_servers.hostname
FROM 
  pf_jc_user_audit,
  pf_jc_user_server_ass, pf_jc_servers
WHERE 
  pf_jc_user_audit.jc_id = pf_jc_user_server_ass.jc_id_ass and  pf_jc_user_server_ass.system_id = pf_jc_servers.system_id';

我尝试过修改:

group_concat(pf_jc_servers.hostname)

然后:

group by pf_jc_user_audit.jc_id

但运气不好,有什么想法吗?

【问题讨论】:

【参考方案1】:

首先,对表使用带有ON 子句和别名的正确连接,以缩短代码并使其更具可读性。

然后按jc_idjc_user分组:

SELECT ua.jc_id, ua.jc_user,
       GROUP_CONCAT(s.hostname) AS hostname
FROM pf_jc_user_audit ua
INNER JOIN pf_jc_user_server_ass us ON ua.jc_id = us.jc_id_ass
INNER JOIN pf_jc_servers s ON us.system_id = s.system_id
GROUP BY ua.jc_id, ua.jc_user

【讨论】:

太好了,让我更接近了。但是,我无法再从 pf_jc_servers.system_id (s.system_id) 表和列中访问“主机名”元素 @user2720970 我在您的示例数据和预期结果中看不到 system_id。主机名不是要与 GROUP_CONCAT() 聚合的列吗?你说我无法访问“主机名”是什么意思? 示例数据在那里,例如:localhost.local、Test Device 等 但是是的,hostname 是 pf_jc_servers 中的一列 @user2720970 我的查询返回 3 列:jc_id、jc_user 和聚合主机名,就像您想要的输出一样。这不是你想要的吗? 这正是我想要的,但是,这就是我得到的:ID:5ff49f6ad2cdea2c6d13e7da,用户:Alexsandro,服务器:ID:5cc0e7b88f594602deecbeda,用户:Andy,服务器:ID:5cc1cc852654795f801ccffc,用户:Ansible,服务器: 等等... php 注意:未定义索引:主机名在 ....

以上是关于用 2 个带条件的表对 concat 进行分组的主要内容,如果未能解决你的问题,请参考以下文章

mysql 分组查询问题 group_concat

使用 concat 按周分组 SQL

分组可排序天时从 group_concat 中选择第一行和最后一行

mysql 对 group_concat 中的项目进行计数

可以在 Excel 中的 PowerPivot 中创建维度和度量分组吗?

mysql中的分组统计函数及其用法实例