如何从两个GROUP_CONCAT列中发现缺失值?

时间:2019-06-10 07:55:51

标签: mysql

我有表All Badges和表User Badge

User Badge中的值都可以在All Badges上找到,并且每个user_id可以有多个User Badge,因此我使用GROUP_CONCAT根据user_id对值进行分组。 User Badge的目标是允许用户收集所有可用的徽章,因此他们将需要有关其个人资料上丢失的徽章的信息。

这是All Badges表:

|---------------|-----------|
|   Badge_ID    |   Label   |
|---------------|-----------|
|       1       |     a     |
|       2       |     b     |
|       3       |     c     |
|       4       |     d     |
|       5       |     e     |
|---------------|-----------|

User Badge表:

|------------------|---------------|---------------|---------------|
|  User_Badge_ID   |  Badge_Label  |    user_ID    |  fk_badge_id  |
|------------------|---------------|---------------|---------------|
|        1         |       a       |       1       |       1       |
|        2         |       a       |       2       |       1       |
|        3         |       b       |       1       |       2       |
|        4         |       a       |       3       |       1       |
|        5         |       b       |       2       |       2       |
|        6         |       c       |       2       |       3       |
|        7         |       d       |       2       |       4       |
|------------------|---------------|---------------|---------------|

我有这个查询来将徽章分组在user_id上,但是我不知道该查询显示缺少的值。

SELECT
     user_badge.user_id AS User_ID
     GROUP_CONCAT(user_badge.Badge_Label) AS User_Badge
FROM
     User_Badge

所需结果。丢失的标志将添加到名为Missing Badge的新列中。

|---------------------|------------------|------------------|
|      User_ID        |    User_Badge    |   Missing Badge  |
|---------------------|------------------|------------------|
|          1          |       a, b       |     c, d, e      |
|---------------------|------------------|------------------|
|          2          |     a, b, c, d   |         e        |
|---------------------|------------------|------------------|
|          3          |         a        |    b, c, d, e    |
|---------------------|------------------|------------------|

有什么想法可以显示每个user_id的缺失值?非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

df.groupby(['Age','Class']).count()

在子查询s中使用交叉连接获取用户可能拥有的所有徽章,主查询检查用户是否拥有交叉连接,如果没有,则左连接返回null。

select s.user_id,
         group_concat(case when fk_badge_id is not null then s.label end) 'user_badge',
         group_concat(case when fk_badge_id is null then s.label end) 'missing'
from
(
SELECT distinct USER_ID,badge_id,ab.label
FROM USER_BADGE ub
CROSS JOIN ALL_BADGES ab
) s
left join user_badge ub on ub.user_id = s.user_id and ub.fk_badge_id = s.badge_id
group by s.user_id;