用 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_id
和jc_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 进行分组的主要内容,如果未能解决你的问题,请参考以下文章
分组可排序天时从 group_concat 中选择第一行和最后一行