我正在尝试将不明显的表转换为一个表,以便 id 表是不同的
我写了一个查询来从用户那里获取角色,但我希望电子邮件是不同的。
SELECT DISTINCT (users.id), (roles.name)
FROM users_roles
INNER JOIN users ON users.id = users_roles.user_id
INNER JOIN roles ON roles.id = users_roles.role_id
我得到的数据是这样的
+---------+--------------+
| ID | Name |
+---------+--------------+
| 1 | Student |
| 2 | Admin |
| 3 | LBC |
| 2 | LBC |
| 4 | Examinator |
| 5 | PO |
+---------+--------------+
我希望取回的数据看起来像这样,所以如果可能的话,我想将名称表作为一个表
+---------+--------------+
| ID | Name |
+---------+--------------+
| 1 | Student |
| 2 | Admin, LBC |
| 3 | LBC |
| 4 | Examinator |
| 5 | PO |
+---------+--------------+
我的数据库使用 MySQL
试试这个:
select b.id, group_concat(b.name ORDER BY b.name SEPARATOR ',') AS Name
from (
SELECT DISTINCT users.id, r.name
FROM users_roles ur
INNER JOIN users u ON u.id = ur.user_id
INNER JOIN roles r ON r.id = ur.role_id ) b
group by id
如果您使用的是 Oracle,则可以为此使用
LISTAGG
:
select id, LISTAGG(name, ',')
from (
SELECT DISTINCT users.id, roles.name
FROM users_roles
INNER JOIN users ON users.id = users_roles.user_id
INNER JOIN roles ON roles.id = users_roles.role_id
)
group by id
这里对于唯一的 ids 名称将用逗号连接。
Demo可以看到here.
如果您使用另一个数据库管理系统,解决方案将是相似的,但具有其他功能(例如
group_concat
用于 MySQL 或 string_agg
用于 PostgreSQL 或 BigQuery)。他们中的大多数列在这个answer.
编辑,对于 MySQL:
select b.id, group_concat(b.name ORDER BY b.name SEPARATOR ',') AS g
from (
SELECT DISTINCT users.id, roles.name
FROM users_roles
INNER JOIN users ON users.id = users_roles.user_id
INNER JOIN roles ON roles.id = users_roles.role_id ) b
group by id
MySQL 演示这里.