我有一个用户表(id,group),如果用户不是某个组的成员,则需要选择1。成员可以是多个组的成员,因此每个ID可能有多个记录(不是唯一的)
我只能返回一个(通过/失败)值,我需要基本检查所有记录,看看用户是否是“admin”的成员。如果是'admin'的成员,我需要声明失败。如果用户的组都不是管理员,那么我需要它通过。我尝试了几种不同的方法,但我不知道我是否走在正确的道路上。
SELECT 1
FROM GRP
WHERE USER = 'name'
AND GROUP NOT IN ('ADMIN')
SELECT 0
FROM GRP
WHERE USER = 'name'
AND EXISTS
(
SELECT 1 FROM GRP
WHERE USER = 'name'
AND GROUP NOT IN ('ADMIN')
)
编辑=我如何解决我的问题
SELECT 1
FROM GRP
WHERE 'name' NOT IN
(
select USER
from GRP
group by USER
having sum(case when GROUP = 'ADMIN' then 1 else 0 end) = 1
)
答案 0 :(得分:1)
SELECT 1 AS COL
FROM GRP
WHERE USER = 'name'
AND GROUP NOT IN ('ADMIN')
UNION ALL
SELECT 0 AS COL
FROM GRP
WHERE USER = 'name'
AND EXISTS
(
SELECT 1 FROM GRP
WHERE USER = 'name'
AND GROUP NOT IN ('ADMIN')
)
答案 1 :(得分:1)
您可以使用group by
,然后检查管理员组是否在having
子句的列表中:
select user
from grp
group by user
having sum(case when group = 'ADMIN' then 1 else 0 end) = 0;
以上内容将返回所有用户。如果您愿意,可以为特定用户添加where
子句。
如果您想为用户提供标记,而不是过滤掉管理组中的标记:
select user, max(case when group = 'ADMIN' then 1 else 0 end) as AdminFlag
from grp
group by user;
编辑:
如果您想为给定用户提供0或1标志:
select max(case when group = 'ADMIN' then 1 else 0 end) as IsInAdminFlag
from grp
where user = 'name';
答案 2 :(得分:0)
您可以使用的另一个答案将为您提供所有用户及其状态的列表。只需按名称添加过滤器。
select
user,
max(case when group = 'admin' then 1 else 0 end) state
from
GRP
where
user = 'my_name'
group by
user