2016-02-23 35 views
0

我有一個有特定角色的用戶表。一個用戶每次爲他們擁有的角色進入表格。我需要計算具有特定角色的所有用戶,但我需要排除也有另一個角色的任何重複記錄。下面是什麼在我的表如果重複記錄具有一定的值,則排除記錄

Name Role 
Steve ROLE_8 
Steve ROLE_9 
Steve ROLE_1 

填充,這是查詢我要選擇誰擁有某些角色的用戶。我需要做的是檢查用戶是否有ROLE_1,並檢查是否有另一個用戶實例具有我不想包含該用戶並將其從返回集中排除的角色。

SELECT COUNT(DISTINCT c.user_id) 
FROM users c 
WHERE email_addr != '' 
AND email_addr IS NOT NULL 
AND EXISTS 
(SELECT r.role_id 
FROM ROLE r, user_role ur 
WHERE c.user_id = ur.user_id 
    AND ur.role_id = r.role_id 
    AND (r.name = 'ROLE_1' 
     OR r.name = 'ROLE_2' 
     OR r.name = 'ROLE_3' 
     OR r.name = 'ROLE_4' 
     OR r.name = 'ROLE_5' 
     OR r.name = 'ROLE_6')) 
+1

你可以顯示你想要的輸出的例子嗎? – GabrielVa

+0

如果我只搜索角色1到6的用戶,並且用戶在數據庫中有兩條記錄,一條使用ROLE_1,另一條使用ROLE_8,那麼我希望從返回集中完全排除該用戶。所以在我給的例子中,我想返回0條記錄,但因爲每條記錄都有一個獨特的角色,我得到1(因爲我選擇不同)。 –

回答

1

使用您的COUNTDISTINCT使得EXISTS不必要的 - 你可以加入到user_role表。在這一點上,你只需要排除那些誰也有一個角色,你不希望用戶:

SELECT 
    COUNT(DISTINCT U.user_id) 
FROM 
    Users U 
INNER JOIN User_Role UR ON UR.user_id = U.user_id AND 
INNER JOIN Role R ON 
    R.role_id = UR.role_id AND 
    R.name IN ('ROLE_USER_ADMIN', 'ROLE_1'...) 
WHERE 
    U.email_addr IS NOT NULL AND U.email_addr <> '' AND 
    NOT EXISTS 
    (
     SELECT * 
     FROM 
      User_Role UR2 
     INNER JOIN Role R2 ON 
      R2.role_id = UR2.role_id AND 
      R2.name IN ('Some_Excluded_Role') 
     WHERE 
      UR2.user_id = U.user_id 
    ) 

如果要排除誰擁有任何角色列表之外,那麼任何用戶你可以做到以下幾點:

SELECT 
    COUNT(DISTINCT U.user_id) 
FROM 
    Users U 
INNER JOIN User_Role UR ON UR.user_id = U.user_id AND 
INNER JOIN Role R ON 
    R.role_id = UR.role_id AND 
    R.name IN ('ROLE_USER_ADMIN', 'ROLE_1'...) 
WHERE 
    U.email_addr IS NOT NULL AND U.email_addr <> '' AND 
    NOT EXISTS 
    (
     SELECT * 
     FROM 
      User_Role UR2 
     INNER JOIN Role R2 ON 
      R2.role_id = UR2.role_id AND 
      R2.name NOT IN ('ROLE_USER_ADMIN', 'ROLE_1'...) 
     WHERE 
      UR2.user_id = U.user_id 
    ) 
+1

將此標記爲正確,因爲這是我測試過的第一個答案,並且這兩個示例均爲我提供了預期結果。非常感謝!如果我應該爲未來的讀者擴展我的問題,請告訴我。 –

0

我相信這會讓你找到你想要的東西(不知道你期望的結果是什麼樣子)。這個概念首先要找到與「好」角色相匹配的概念,然後用另一個子過濾選擇那些也具有「壞」角色的概念。

SELECT COUNT(DISTINCT c.[user_id]) 
FROM users AS c 
    INNER JOIN user_role AS ur 
     ON ur.[user_id] = c.[user_id] 
WHERE c.email_addr != '' 
    AND c.email_addr IS NOT NULL 
    AND ur.role_id IN 
     (SELECT sub_r.role_id 
     FROM [role] AS sub_r 
     WHERE sub_r.name IN ('ROLE_USER_ADMIN', 'ROLE_1') 
     ) 
    AND c.[user_id] NOT IN 
     (SELECT sub2_ur.[user_id] 
     FROM user_role AS sub2_ur 
      INNER JOIN [role] AS sub2_r 
       ON sub2_r.role_id = sub2_ur.role_id 
     WHERE sub2_r.name IN ('ROLE_NOT_TO_USE','ANOTHER_NOT_TO_USE') 
      AND sub2_ur.[user_id] = c.[user_id] 
     ) 
0

如果我想獲得一個數據集在我包括具有兩種角色1,2或3的用戶,我想排除有作用,4和5的用戶,我如果「姓名」是唯一的,則會執行以下操作:

SELECT COUNT(DISTINCT Name) 
FROM ROLE 
WHERE Role IN ('ROLE_1','ROLE_2','ROLE_3') 
AND Name NOT IN (SELECT DISTINCT Name FROM ROLE WHERE Role IN ('ROLE_4','ROLE_5');