如何在mysql查询中将连接结果选择到数组中?

Sea*_*all 3 mysql

我正在尝试编写一个脚本,将 modx 用户导出到 CSV,相当简单的东西,但在 modx 中,用户可以属于许多组。只需加入 modx_member_groups 表就会为不同的用户生成多行。

我想做的是以某种方式重写下面的查询,以便 modx_member_groups 上的联接将返回用户所属的组 id 的列表或数组。

例如,我希望返回的数据如下所示:

user_group | id | username | ...the rest
1,3,5,7    | 12 | johndoe  | ...
Run Code Online (Sandbox Code Playgroud)

这是我的疑问。

SELECT mg.user_group, u.id, u.username, ua.*

FROM modx_users u 

LEFT JOIN modx_user_attributes ua ON u.id = ua.internalKey 

LEFT JOIN modx_member_groups mg ON u.id = mg.member

LIMIT 10
Run Code Online (Sandbox Code Playgroud)

理想情况下,以某种方式选择实际的组名称作为列会很棒。然后在组名列中强制输入 true 或 false。

更新

我在 shtever 回答后更新了查询,但存在性能问题: - GROUP_CONCAT 返回 BLOB 类型,因此我必须转换它,将 group_concat_max_length 设置为低于 512 不起作用

SELECT GROUP_CONCAT(CONVERT(mg.user_group, CHAR(10)) ORDER BY mg.user_group SEPARATOR ',') AS groups, u.id, u.username, ua.*
FROM modx_users u 
LEFT JOIN modx_user_attributes ua ON u.id = ua.internalKey 
LEFT JOIN modx_member_groups mg ON mg.member = u.id
GROUP BY u.id
Run Code Online (Sandbox Code Playgroud)

现在,如果我将查询限制为 10 个结果或让它在整个 6000 个用户上运行,则执行该查询需要 27.5 秒,那么它始终需要 27.5 秒。如果我删除 GROUP_CONCAT ~ 相同的时间。

sch*_*ver 5

对于 MySQL,请查看 GROUP_CONCAT 函数。 Mysql GROUP_CONCAT 说明

您的查询可能类似于:

SELECT GROUP_CONCAT(DISTINCT mg.user_group ASC SEPARATOR ',') , u.id, u.username, ua.*
FROM modx_users u 
LEFT JOIN modx_user_attributes ua ON u.id = ua.internalKey 
LEFT JOIN modx_member_groups mg ON u.id = mg.member
GROUP BY u.id, u.username
LIMIT 10
Run Code Online (Sandbox Code Playgroud)

您可能需要根据 modx_user_attributes 和 modx_users 表之间的关系来修改 GROUP BY 字段。