[英]How to “remove duplicates” from a UNION query
我在MySQL中有两个表:一个叫gtfsws_users
,它包含我正在开发的系统的用户,另一个叫gtfsws_repository_users
,它包含这些用户的角色。
gtfsws_users
具有以下字段: 电子邮件 , 密码 , 名称 , is_admin和enabled 。 gtfsws_repository_users
具有: user_email , repository_id和role 。
该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.