2013-06-05 69 views
0

我有一個用戶表和一個時間表條目表。我試圖獲取每個員工的sum(time_entry.hours_worked),其中日期在一定範圍內。在MySQL中,如何獲得一個聚合函數在where子句和group之後返回0?

有了:

SELECT employee.id, COALESCE(SUM(time_entry.hours_worked),0) as `sum` 
FROM employee 
LEFT JOIN time_entry 
ON employee.id = time_entry.student_id 
GROUP BY employee.id; 

我能得到所有員工的條目,即使沒有時間的工作:

+----+--------+ 
| id | sum | 
+----+--------+ 
| 1 | 191.00 | 
| 2 | 48.00 | 
| 3 | 0.00 | 
+----+--------+ 

隨着WHERE語句:

SELECT employee.id, COALESCE(SUM(time_entry.hours_worked),0) AS `sum` 
FROM employee 
LEFT JOIN time_entry 
ON employee.id = time_entry.student_id 
WHERE time_entry.date < 1367798400 
GROUP BY employee.id; 

我獲得一個空集。如何使用WHERE聲明,並且在數據庫中未找到任何條目時仍然獲得每個員工0個?

+0

怎麼你的空集看起來...你可以提供像第一結果的一個例子設置 – Hackerman

回答

0

問題在於條件在left outer join的第二個表上。沒有匹配時,所有列都設置爲NULL。所以,where子句失敗。事實上,這種情況是將left outer join重新轉換爲inner join

爲了解決這個問題,移動條件的on條款:

SELECT employee.id, COALESCE(SUM(time_entry.hours_worked),0) AS `sum` 
FROM employee 
LEFT JOIN time_entry 
ON employee.id = time_entry.student_id and 
    time_entry.date < 1367798400 
GROUP BY employee.id; 
+0

非常感謝!這固定了它。 – charlespwd

相關問題