INNER JOIN 表上的 DISTINCT

问题描述 投票:0回答:2

我正在尝试将不明显的表转换为一个表,以便 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

sql inner-join distinct
2个回答
1
投票

试试这个:

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

0
投票

如果您使用的是 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 演示这里.

© www.soinside.com 2019 - 2024. All rights reserved.