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

时间:2015-01-25 01:59:55

标签: mysql

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

我想要做的是以某种方式重写下面的查询,以便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秒,那么查询现在需要27.5秒才能执行。如果我删除GROUP_CONCAT~相同的时间。

1 个答案:

答案 0 :(得分:2)

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

您的查询可能如下所示:

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

根据modx_user_attributes和modx_users表之间的关系,您可能不得不使用GROUP BY字段。