关于双连接的mysql group_concat

时间:2012-01-15 18:44:09

标签: mysql group-concat concat

我有一个用户表,我想要所有值,所以我有这个查询:

SELECT tbl_user.* FROM tbl_user

现在我想在此结果中添加一个附加列,该列显示此用户拥有的所有角色(如果用户没有角色,则不显示任何内容)。角色信息来自另外两个表格。

第一个表包含以下两个值:userid,roleid 第二个表包含roleid和role_name。

因此,group concat需要根据table1中的roleid获取所有角色名称。

我尝试了几种不同的方法来做到这一点,但我没有成功。要么我只获得一个具有相同角色名数的结果,要么根本没有结果。

感谢您的帮助

迈克尔

1 个答案:

答案 0 :(得分:2)

更新:为没有角色的用户添加了LEFT JOIN

SELECT
  tbl_user.*,
  GROUP_CONCAT(role_name) AS roles
FROM 
  tbl_user LEFT JOIN tbl_roles ON tbl_user.userid = tbl_roles.userid
  JOIN tbl_rolenames ON tbl_roles.roleid = tbl_rolenames.roleid
GROUP BY tbl_user.userid

请注意,MySQL将允许GROUP BY列的总数少于SELECT列表中显示的列数,但在其他RDBMS中,您需要明确列出tbl_user中的列和将它们包含在GROUP BY中,或针对tbl_user进行额外的自我加入,以获取该表中的其余列。

类似的东西:

SELECT 
  urole.userid,
  uall.username,
  uall.name,
  uall.othercols,
  urole.roles
FROM
  tbl_user uall JOIN (
  SELECT 
    tbl_user.userid, 
    GROUP_CONCAT(role_name) AS roles
  FROM 
    tbl_user LEFT JOIN tbl_roles ON tbl_user.userid = tbl_roles.roleid
    JOIN tbl_rolenames ON tbl_roles.roleid = tbl_rolenames.roleid
  GROUP BY tbl_user.userid
) urole ON uall.userid = urole.userid