mysql - 如何从 UNION 查询中获取 "remove duplicates"

标签 mysql

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

gtfsws_users具有以下字段:emailpasswordnameis_adminenabledgtfsws_repository_users具有:user_emailrepository_idrole

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

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

现在,只有在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_users 中有这个:

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

并且用户也在gtfsws_repository_users中注册像这样:

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

当我执行 SELECT 时在 MySQL 中(使用 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

关于mysql - 如何从 UNION 查询中获取 "remove duplicates",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29875740/

相关文章:

mysql - 仅 Solr 与 Solr/MySQL 解决方案

php - 使用 PHP 列出 MySQL 数据库中的所有表

mysql - 从多个表中组合选择每组的最大值

PHP 添加日期 - mysqli_stmt::bind_param()

MySQL加入并获取所有关系,即使为0

php - 使用文件路径更新 SQL 表

mysql - 更新内部选择成功但数据未更新

php - 需要帮助创建单个 Mysql 查询

mysql - Doctrine2 链式多表连接和过滤

mysql:从右边返回第一个出现的子字符串? (子字符串?!)