繁体   English   中英

如何从UNION查询中“删除重复项”

[英]How to “remove duplicates” from a UNION query

我在MySQL中有两个表:一个叫gtfsws_users ,它包含我正在开发的系统的用户,另一个叫gtfsws_repository_users ,它包含这些用户的角色。

gtfsws_users具有以下字段: 电子邮件密码名称is_adminenabled gtfsws_repository_users具有: user_emailrepository_idrole

role是一个整数,用于定义对GTFS存储库的权限(公共交通数据,与我的问题无关)。

重要的一点是, 每个管理员助理 (即,在gtfsws_users is_admin标志设置为1每个用户)都具有对所有存储库的完全访问权限。

现在,只有在gtfsws_repository_users注册的用户才能访问在那里定义的特定存储库(当然,除非他们是管理员)。 一个用户可以拥有他/她可以访问的多个存储库。

我想做的是让所有用户都可以访问特定的存储库 (用户具有哪种role都没有关系,我只想知道他们是否可以访问存储库)。 因此,我正在编写此SQL语句以获取它们:

(
    SELECT DISTINCT
        gtfsws_users.email AS email,
        gtfsws_users.name AS name,
        gtfsws_users.is_admin AS is_admin,
        gtfsws_users.enabled AS enabled,
        gtfsws_repository_users.role AS role
    FROM
        gtfsws_users
    INNER JOIN
        gtfsws_repository_users
    ON
        gtfsws_users.email = gtfsws_repository_users.user_email
    WHERE
        gtfsws_repository_users.repository_id = '2'
)
UNION
(
    SELECT
        email,
        name,
        is_admin,
        enabled,
        null AS role
    FROM
        gtfsws_users
    WHERE
        is_admin = 1
)

现在,这对于可以访问不同存储库的用户来说很好用。 它还会吸引所有管理员。

问题是当我有一个也在gtfsws_repository_users注册的gtfsws_repository_users ,因为我重复了它。

例如,我在gtfsws_users有这个:

('test@test.com', '*****', 'Real name', 1, 1)

并且该用户也在gtfsws_repository_users注册为:

('test@test.com', 2, 10)

当我在MySQL中执行SELECT (使用UNION添加所有管理员)时,我得到:

('test@test.com', 'Real name', 1, 1, 10)
('test@test.com', 'Real name', 1, 1, NULL)

我需要做的是过滤该表以删除重复项,即只能得到:

('test@test.com', 'Real name', 1, 1, NULL)

是的,获得NULL作为角色(因为它将被忽略,因为用户是管理员)。

有人知道如何实现这一目标吗? 非常感谢。

编辑 :好的,感谢卡特琳(Katrin)的建议,我取得了一些进展。 我确实得到了一行,但这是定义了role编号的那一行。 有什么方法可以保留带有NULL角色而不是已定义角色的角色?

由于聚合函数会忽略空值,因此可以将空值转换为可以提取为最小值或最大值的数字。
假设您的所有角色都大于0:

SELECT email, name, is_admin, enabled, nullif(min(coalesce(role, 0)), 0) as role
from
((
    SELECT DISTINCT
        gtfsws_users.email AS email,
        gtfsws_users.name AS name,
        gtfsws_users.is_admin AS is_admin,
        gtfsws_users.enabled AS enabled,
        gtfsws_repository_users.role AS role
    FROM
        gtfsws_users
    INNER JOIN
        gtfsws_repository_users
    ON
        gtfsws_users.email = gtfsws_repository_users.user_email
    WHERE
        gtfsws_repository_users.repository_id = '2'
)
UNION
(
    SELECT
        email,
        name,
        is_admin,
        enabled,
        null AS role
    FROM
        gtfsws_users
    WHERE
        is_admin = 1
)) as Q
GROUP BY email, name, is_admin, enabled

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM