GROUP_CONCAT()函数返回不匹配的字段?

时间:2017-05-16 05:56:08

标签: mysql sql group-concat

我的数据库中有三个表,出于讨论的目的,我们说它们是:

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    ROLES_HELD      ROLES_LACKED
1          Bob          User,Writer     Editor,Admin
2          Doug         User            Writer,Editor,Admin

我想做的还是返回用户没有的角色列表。

我最初的想法是使用子查询然后连接它,但我似乎无法让它工作。有人能指出我正确的方向吗?

谢谢!

编辑:为了澄清,所需的输出将是一个返回user_id,user_name,用户所拥有的角色的串联字符串以及用户不具有的角色的串联字符串的查询有。例如:

from collections import OrderedDict

c = OrderedDict()
n = 1
with open('file.txt', 'r') as f:
    for line in f:
        c.update({n:line})
        #if you just want to print it, skip the dict part and just do:
        print n,line
        n += 1

2 个答案:

答案 0 :(得分:1)

我同意在这里使用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

答案 1 :(得分:0)

您可以尝试连接两次表角色第一次获得角色,第二次获得缺少角色。

FIRInstanceID.instanceID().token()

我创建了一个演示here