我的数据库中有三个表,为了便于讨论,假设它们是:
USERS
-----
user_id
user_name
ROLES
-----
role_id
role
USER_ROLES
----------
user_role_id
user_id
role_id
我可以轻松地使用 GROUP_CONCAT()
返回用户拥有拥有的逗号分隔角色列表,如下所示:
SELECT u.user_id, u.user_name, GROUP_CONCAT(role) AS roles_held
FROM users u,
roles r,
user_roles ur
WHERE u.user_id = ur.user_id
AND r.role_id = ur.role_id
GROUP BY u.user_id, u.user_name;
我还想返回用户没有的角色列表。
我最初的想法是使用子查询然后将其连接起来,但我似乎无法让它发挥作用。有人可以指出我正确的方向吗?
谢谢!
编辑:为了澄清,所需的输出将是一个返回 user_id、user_name、用户拥有的角色的串联字符串和用户不具有的角色的串联字符串的查询有。例如:
USER_ID USER_NAME ROLES_HELD ROLES_LACKED
1 Bob User,Writer Editor,Admin
2 Doug User Writer,Editor,Admin
最佳答案
我同意在这里使用CROSS JOIN
,但它不需要那么复杂:
SELECT
u.user_id,
u.user_name,
GROUP_CONCAT(case when ur.user_id is not null then r.role end) AS roles_held,
GROUP_CONCAT(case when ur.user_id is null then r.role end) as roles_lacked
FROM
users u
CROSS JOIN roles r
LEFT JOIN user_roles ur ON
u.user_id = ur.user_id
AND r.role_id = ur.role_id
GROUP BY
u.user_id, u.user_name
关于mysql - GROUP_CONCAT() 之类的函数返回不匹配的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43993482/