【问题标题】:MySQL - Pivot rows to comma separated values [duplicate]MySQL - 将行旋转到逗号分隔值[重复]
【发布时间】:2021-05-18 01:48:28
【问题描述】:

我有 3 张桌子。

1. user
2. user_role
3. user_role_mapping

样本记录,

用户

+--------+----------+---------------+
| userid | username | email         |
+--------+----------+---------------+
|      1 | user1    |user1@test.com |
|      2 | user2    |user2@test.com |
+--------+----------+---------------+

用户角色

+--------+----------+
| roleid | rolename |
+--------+----------+
|      1 | user     |
|      2 | manager  |
|      3 | director |
|      4 | admin    |
+--------+----------+

用户角色映射

+--------+------+
| roleid |userid|
+--------+------+
|      1 | 1    |
|      2 | 1    |
|      3 | 1    |
+--------+------+

查询

select u.userid, u.username, u.email,
  count(case when ur.rolename = 'user' THEN 1 END) user,
  count(case when ur.rolename = 'manager' THEN 1 END) manager,
  count(case when ur.rolename = 'director' THEN 1 END) director,
  count(case when ur.rolename = 'admin' THEN 1 END) admin
from user_role ur
left join userrole_mapping urm
  on ur.roleid = urm.roleid
left join user u
  on urm.userid = u.userid
group by u.userid, u.username, u.email

结果:-

+--------+----------+---------------+------|---------|----------|-------|
| userid | username | email         | user | manager | director | admin |
+--------+----------+---------------+------------------------------------
|      1 | user1    |user1@test.com | 1    |   1     |  1       |  1    |
+--------+----------+---------------+------------------------------------

在这里,我正在对查询中的角色进行硬编码,并且将来可以添加新角色,我不想更改代码。有没有更好的方法?对于结果中的角色,我可以使用逗号分隔的结果。

【问题讨论】:

  • count(case when ur.rolename = 'role' THEN 1 END) 可以简化为SUM(ur.rolename = 'role')

标签: mysql sql pivot-table crosstab


【解决方案1】:

逗号分隔可以使用group_concat:

select u.user_id, u.user_name, u.email,
       Group_concat(ur.role_name) roles
from user u
left join user_role_mapping urm
  on urm.user_id = u.user_id
left join user_role ur
  on ur.role_id = urm.role_id
where u.user_id = ?
group by u.user_id;

另一种可能更好的不使用硬编码的方法是分别查询角色:

select u.user_id, u.user_name, u.email, ur.role_name
from user u
left join user_role_mapping urm
  on urm.user_id = u.user_id
left join user_role ur
  on ur.role_id = urm.role_id
where u.user_id = ?;

【讨论】:

    猜你喜欢
    • 2021-08-31
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多