2013-07-23 81 views
0

2 I有兩個表MySQL查詢(組由)

一個logs.emails:

EmailNum EmployeeID, Emailcontent, EmailReceivers ,is_read 
    1   1  , "sasa"  , "[email protected]" ,1 
    2   1  , "sasa"  , "[email protected]" ,0 
    3   2  , "sasa"  , "[email protected]" ,0 
    4   2  , "sasa"  , "[email protected]" ,0 
    5   2  , "sasa"  , "[email protected]" ,0 

和Employees.user

id, FirstName, LastNAme 
1 , "John" , "Brown" 
2 , "Jack" , "James" 

我所需的輸出:

名,姓,NumOfUnreadEmails
約翰·布朗,1
傑克,詹姆斯,3

我嘗試(但它不會返回所需的輸出的IRST行是 「約翰·布朗,1」):

SELECT 
    *, count(EmployeeID) as NumEmails 
FROM 
    logs.emails a 
inner join 
    Employees.user b on a.EmployeeID=b.id 
group by 
    EmployeeID 
having 
    a.is_read='0' 

您的幫助表示讚賞

+0

傑克詹姆斯是否應該有2以上的id?他們現在都有相同的ID。 –

+0

YE糾正了,謝謝 –

+0

你不能這樣做'*,COUNT('因爲你必須將所有的列組合在一起,你只想從'Employees.user'中輸入嗎? –

回答

3

您應該指定一個WHERE子句,而不是使用HAVING,因爲您要在進行任何聚合之前過濾出具有is_read=0的記錄。

此外,爲了僅獲得所需的字段,請勿使用*。只需指定你想要的字段。

SELECT 
    b.FirstName, b.LastName, COUNT(a.EmailNum) 
FROM 
    logs.emails a 
inner join 
    Employees.user b on a.EmployeeID=b.id 
where 
    a.is_read='0' 
group by 
    b.id 
+2

這並不會返回那些根本沒有未讀電子郵件或沒有電子郵件的員工。也許這沒關係,但是有一點要注意。 – GolezTrol

+0

我不想返回 –

+0

這並沒有被提及,但如果需要,你可以參考你提供的答案,它提供了這個結果。 –

1

試試這個方法:

SELECT b.FirstName, b.LastName, 
     sum(case 
       when a.is_read=0 than 1 
       else 0 
      end) as NumOfUnreadEmails 
FROM logs.emails a 
inner join Employees.user b on a.EmployeeID=b.id 
group by b.FirstName, b.LastName 
+0

對於沒有任何電子郵件的任何employees.user,這不會返回零的計數。有多種方法可以編寫將返回零計數的語句,以及(可能)通過包含謂詞來提高性能on'logs.emails.is_read = 0' – spencer7593

1

這將返回所有員工,包括根本沒有任何電子郵件的員工。如果您只想顯示那些確實有未讀電子郵件的人,則可以將LEFT JOIN更改爲INNER JOIN

SELECT 
    u.FirstName, 
    u.LastName, 
    COUNT(e.EmployeeID) AS NumOfUnreadEmails 
FROM 
    Employees.user u 
    LEFT JOIN logs.emails e ON e.EmployeeID = u.id AND e.is_read = 0 
GROUP BY 
    u.id 
+0

這是如此接近!但是聚合實際上需要像COUNT(e.EmployeeID)這樣的東西,這樣我們就可以爲沒有未讀電子郵件的用戶獲得零計數。 – spencer7593

+0

@ spencer7593你是對的。謝謝,先生,我修好了。 – GolezTrol

+0

+1。是的,那是票。我們可能會注意到,「覆蓋指數」例如'ON logs.emails(EmployeeID,is_read)'可以顯着提高查詢的性能。 (現在只需簡單地刪除'LEFT'關鍵字就可以消除零計數的行。) – spencer7593