我有表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的缺失值?非常感谢您的帮助。
答案 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;