2015-09-15 156 views
2

我需要此查詢以在計數爲0時返回結果而不是僅生成空集。我如何調整我的查詢,以便它產生下面的表,其中計數和相應的日期爲'0'?當返回0時查詢不會返回結果

mysql> select count(test.id), date(insert_datetime) date 
from db.table test where date(insert_datetime)='2015-08-17' 
group by date(insert_datetime); 
    +--------------+------------+ 
    | count(test.id) | date  | 
    +--------------+------------+ 
    |   42 | 2015-08-17 | 
    +--------------+------------+ 
    1 row in set (0.14 sec) 


mysql> select count(test.id), date(insert_datetime) date 
from db.table test where date(insert_datetime)='2015-08-16' 
group by date(insert_datetime); 

Empty set (0.00 sec) 
+0

如果您必須執行'date(insert_datetime)',那麼該字段的數據類型是什麼? – Uueerdo

+0

你只能返回最多1行,對嗎?嘗試刪除group by子句。 – ESG

+0

date()被使用,因爲datetime是YYYY:MM:DD HH:MM:SS – user3299633

回答

2

這應做到:

SELECT theDate AS `date`, IFNULL(subC.theCount, 0) AS `theCount` 
FROM (SELECT DATE(20150817) AS `theDate`) AS subD 
LEFT JOIN (
    SELECT COUNT(test.id) AS theCount, DATE(insert_datetime) AS `theDate` 
    FROM db.table AS test 
    WHERE insert_datetime BETWEEN 20150817000000 AND 20150817235959 
    GROUP BY theDate 
) AS subC 
USING (theDate) 
; 

作爲另一個用戶在現在刪除評論暗示:如果你將需要這一個日期範圍,「所有日期」表可能會在比subD子查詢更方便;使子查詢SELECT DATE(X) UNION SELECT DATE(Y) UNION SELECT DATE(Z) UNION SELECT DATE(etc...)得到相當快速的荒謬。

+0

它將返回一行,日期字段= 20150817,「count」字段=找到的記錄數,如果沒有,則返回0。究竟是什麼問題想要。 – Uueerdo