2014-04-23 49 views
0

我有一个用户表(id,group),如果用户不是一个组的成员,需要选择1。一个成员可以是多个组的成员,因此每个ID可能有多个记录(不是唯一的)从集合中只选择一个结果

我只能返回一个(通过/失败)值,我需要基本检查所有记录看看用户是否是“管理员”的成员。如果是“管理员”的成员,我需要声明失败。如果没有用户的组是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') 
    ) 

EDIT =我如何解决我的问题

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 
    ) 

回答

1

您可以使用group by然后检查admin组是否在列表中的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'; 
+0

使用第一个示例我可以看到我正在接近。如何检查用户是否在返回的结果中,然后返回1,如果他们是? – Echofiend

+0

我使用了一个关于你做了什么的回合。我更新了我的问题,以显示它目前的工作情况。但谢谢你的回答,你是一个很大的帮助 – Echofiend

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') 
) 
+0

我试过了,它仍然返回不是'ADMIN'的行。我需要以某种方式返回0,如果用户的任何记录具有“ADMIN”,并且返回1,如果它们中没有一个是。例如, 例如,我的测试帐户是5个组的成员,这会返回4条记录(不包括sysadmin记录) – Echofiend

0

你可以使用的另一个答案会给你一个所有用户及其状态的列表。只需按名称添加过滤器。

select 
    user, 
    max(case when group = 'admin' then 1 else 0 end) state 
from 
    GRP 
where 
    user = 'my_name' 
group by 
    user 
相关问题