【发布时间】: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