我正在尝试编写一个脚本,将modx用户导出为CSV格式,这是相当简单的事情,但在modx中,用户可以属于多个组。简单地加入 modx_member_groups 表会导致不同用户的多行结果。
我想做的是以某种方式重写以下查询,使在 modx_member_groups 上的连接返回用户所属的一组组 ID 的列表或数组。
例如,我希望返回的数据如下:
理想情况下,以实际组名作为列进行选择会更好。然后只需在组名列中强制使用true或false即可。
更新:
在shtever的回答之后,我已经更新了查询,但是遇到了性能问题: - GROUP_CONCAT返回的是BLOB类型,所以我必须进行转换,将group_concat_max_length设置为小于512不起作用。
我想做的是以某种方式重写以下查询,使在 modx_member_groups 上的连接返回用户所属的一组组 ID 的列表或数组。
例如,我希望返回的数据如下:
user_group | id | username | ...the rest
1,3,5,7 | 12 | johndoe | ...
这是我的查询。
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
理想情况下,以实际组名作为列进行选择会更好。然后只需在组名列中强制使用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
如果我将查询限制为10个结果或让其在整个6000个用户上运行,现在执行查询需要27.5秒。如果我删除GROUP_CONCAT,则需要相同的时间。