2011-03-17 83 views
2

我一直在嘗試不同的方法來處理這個問題,但我沒有多少運氣。有選擇的條件計數/總和

基本上這個查詢返回一個員工所建立的所有目錄。我需要添加一個字段到這個查詢的選擇中,該字段列出了有多少個具有'admin'訪問權限(u.access_level)的其他用戶被構建到目錄中)。

Table: Directories (has many users) 
Table: Users (users of the directory with different access levels) 

SELECT d.id, d.name, u.employee_number, u.access_level, u.id 'user_id', 
(** count of all users of this directory where their u.access_level = 'admin) AS admins 
FROM directories d JOIN users u ON d.id = u.directory_id 
WHERE u.employee_number = '045283' 
ORDER BY d.NAME 

所以,我需要返回所有目錄僱員內置,包括有每個目錄「管理」權限的用戶總數的記錄。基本上我需要計算一些後來的框架邏輯,比如'如果員工是這個目錄的最後一個管理員 - 不允許他們刪除他們自己或者更改他們的訪問級別 - 先將其他用戶升級到管理員級別。

感覺就像我需要一個子查詢,但是現在有點超出了我的SQL技能。謝謝你的幫助!

回答

1
Select d.id, d.name, u.employee_number, u.access_level, u.id 'user_id' 
    , (Select Count(*) 
     From directories As D1 
      Join users As U1 
       On U1.directory_id = D1.id 
     Where U1.access_level = 'admin' 
      And D1.id = D.id) As AdminUsers 
From directories As D 
    Join users As U 
     On U.directory_id = D.id 
Where u.employee_number = '045283' 
Order By d.Name 

使用派生表(可能有更好的表現),另一種解決方案:

Select d.id, d.name, u.employee_number, u.access_level, u.id 'user_id' 
    , Coalesce(AdminDir.AdminCount,0) As AdminCount 
From directories As D 
    Join users As U 
     On U.directory_id = D.id 
    Left Join (
       Select D1.id, Count(*) As AdminCount 
       From directories As D1 
        Join users As U1 
         On U1.directory_id = D1.id 
       Where U1.access_level = 'admin' 
       Group By D1.id 
       ) As AdminDir 
      On AdminDir.id = D.id 
Where u.employee_number = '045283' 
Order By d.Name 
+0

真棒謝謝! - 我只嘗試過第二個例子 - 它完美地工作(超過了我目前的技能水平)。一個小類型o在第二行:'AdminDir.AdminAcount'應該是'AdminDir.AdminCount。 – Reno 2011-03-17 17:06:14

+0

@Reno - 很高興能幫到你。我會解決你提到的錯字。 – Thomas 2011-03-17 17:20:35

1

試試這個:

SELECT d.id, d.name, u.employee_number, u.access_level, u.id 'user_id', 
SUM(IF(u.access_level = 'admin',1,0)) AS admins 
FROM directories d JOIN users u ON d.id = u.directory_id 
WHERE u.employee_number = '045283' 
ORDER BY d.NAME 

這樣的領域只會增加1時u.access_level = 'admin',如果它不是那麼它將增加0 - 這當然意味着它不會指望它

+0

這是接近我的失敗嘗試實際上之一。這樣做只返回一行,列出第一個找到的目錄和所有目錄中所有者的總數。謝謝你! – Reno 2011-03-17 16:54:38

+0

@Reno:這很簡單,然後 - 簡單地按d.id'字段進行分組,每個目錄顯示一個結果 – BigFatBaby 2011-03-17 17:26:27

1

你在尋找這樣的事情:

SELECT d.id, d.name, u.employee_number, u.access_level, u.id 'user_id', 
SUM(IF(u.access_level = 'admin',1,0)) AS admins 
FROM directories d JOIN users u ON d.id = u.directory_id 
WHERE u.employee_number = '045283' 
ORDER BY d.NAME 
+0

與BigFatBaby示例相同的問題:這樣做只會返回員工有權訪問的第一個目錄與他們有權訪問的所有目錄中的管理員總數。謝謝你! – Reno 2011-03-17 16:56:27

12
sum(if(u.access_level = 'admin',1,0)) as admins 

編輯。請注意,這種情況下甚至可以以這種方式

sum(u.access_level = 'admin') 

因爲MySQL只返回1,如果條件爲真0,如果是沒有被改寫。