仅从一组中选择一个结果

时间:2014-04-23 19:21:52

标签: sql select

我有一个用户表(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
    )

3 个答案:

答案 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