2011-09-14 46 views
0

我在我的管理區域中有一個頁面,我想禁止用戶,但我只想允許禁止具有一個角色的用戶,即用戶。下面是一些示例數據選擇只有一個角色和一個角色的所有用戶 - 很多2個很多的關係

用戶1 - 角色(禁止)
用戶2 - 角色(管理員,用戶)
用戶3 - 角色(非公開)

用戶4 - 角色(用戶)

只有用戶4應該返回,因爲他們是具有用戶角色和用戶角色的唯一用戶只有。我試着在下面寫下我自己的查詢,但遇到了如何將用戶排除在以外的用戶角色之中。

SELECT users.*, COUNT(*) AS role_count 
FROM users 
JOIN roles_users 
ON users.id = roles_users.user_id 
JOIN roles 
ON roles_users.role_id = roles.id 
GROUP BY users.id 

WHERE roles.name = 'user'在那裏做role_count = 1

讚賞任何幫助。

+0

請問我該問什麼RDBMS? –

+0

MySQL,我將它添加到標籤。 –

回答

2
SELECT users.*, COUNT(*) AS role_count, 
     SUM(case roles.name when 'user' then 1 else 0 end) AS IsUser 
FROM users 
JOIN roles_users 
ON users.id = roles_users.user_id 
JOIN roles 
ON roles_users.role_id = roles.id 
GROUP BY users.id 
HAVING COUNT(*) = 1 
AND SUM(case roles.name when 'user' then 1 else 0 end) = 1 
+0

+1 - 關於我的查詢問題的好處 – JNK

0
SELECT * 
    FROM users 
WHERE EXISTS (
       SELECT * 
       FROM roles_users 
         JOIN roles 
         ON roles_users.role_id = roles.id    
       WHERE users.id = roles_users.user_id 
         AND roles.name = 'user' 
      ) 
     AND NOT EXISTS (
         SELECT * 
         FROM roles_users 
           JOIN roles 
           ON roles_users.role_id = roles.id    
         WHERE users.id = roles_users.user_id 
           AND roles.name <> 'user' 
        ); 
0

人們不應該把這個名字在內部查詢的WHERE子句中,否則將只能算做角色至極的名字是「用戶」。首先選擇只有一個角色的用戶,然後在這些用戶中驗證他們的角色是用戶角色的用戶。

我相信下面會做到這一點。

SELECT 
    u.id 
    , roles.name 
FROM 
    users u 
    INNER JOIN roles_users ON u.id = roles_users.user_id 
    INNER JOIN roles  ON roles_users.role_id = roles.id 
WHERE 
    exists (
     SELECT 
      users.id, COUNT(*) AS role_count 
     FROM 
      users u2 
      JOIN roles_users ON u2.id = roles_users.user_id 
     WHERE 
      u2.id = u.id 
     GROUP BY 
      users.id 
     HAVING COUNT(*) = 1 
      ) 
    AND roles.name = 'user' 
相關問題