mysql - GROUP_CONCAT() 之类的函数返回不匹配的字段?

标签 mysql sql group-concat

我的数据库中有三个表,为了便于讨论,假设它们是:

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/

相关文章:

mysql - 优化MYSQL大数据查询

java - 如何保护 MySQL 数据库免受未经授权的访问并从 Java 应用程序安全地连接到它

Mysql group_concat 按计数拆分

MySQL 如何对 Joined 和 Group_Concat 列进行排序?

php - 使用ajax更新数据库中的表

mysql - 将限制 GET 参数直接传递给 MySQL 安全问题?

mysql - 具有日期范围的不同列中的 SQL 计数值

php - 如何从sql数据库中的2个表中获取多列数据?

sql - vb.net - 从数据库中读取空值

mysql - 两个表之间的组连接