2014-04-23 48 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 
相關問題