2015-04-05 22 views
0

我下面的查詢時,COUNT(*)結果恢復0行MySQL的GROUP BY DAY在同一個表不工作時數爲零

SELECT COUNT(id) test, 
     UNIX_TIMESTAMP(my_time)*1000 d 
FROM chat_table 
WHERE dept_id = 5 
    AND my_time >="2015-03-30" 
GROUP BY DAY(my_time) 
ORDER BY d ASC; 

我需要GROUP BY一天,甚至連返回0行不會返回行。如何可以在同一個表中加入?或任何想法?

回答

1

您只能根據存在的值創建組。如果表中不存在值,例如timestamp'2015-04-01 12:00:00',則它不能作爲結果的一部分。

您可以變通的作法是:

  • 處理的編程語言的查詢結果,補充數量0所有行是缺少
  • 或創建一個包含所有時間戳參考表
  • 或者使用子查詢和聯合手動注入所有時間戳。

最好的選擇是第一種:保持您的查詢不變,但是在啓動查詢的程序中編寫邏輯,以便在時間戳不在結果集中時自動假定計數爲零。

例如,在PHP:

$countsPerTimestamp = array(); 
foreach ($stmt->fetchAll() as $row) { 
    $countsPerTimestamp[$row['d']] = $row['test']; 
} 

$searchTimestamp = '2015-04-05 12:13:14'; 
if (isset($countsPerTimestamp[$searchTimestamp])) { 
    echo 'Count for now is: ' . $countsPerTimestamp[$searchTimestamp]; 
} 
else { 
    echo 'Count for now is: 0'; 
} 
+0

謝謝@托馬斯,有一個想法。如果我的日程範圍已知,我將在日程安排中進行分組 – 2015-04-05 13:50:28

+0

如果範圍中的時間戳數很少,您也可以像這樣加入它們:SELECT mtimestamp,count(id)from(select'2015-04-04 12 :13:14'作爲mtimestamp UNION選擇'2015-04-04 12:13:15'UNION選擇'2015-04-04 12:13:16')作爲郵票左加入chat_table上stamps.mtimestamp = chat_table.my_time組由mtimestamp – 2015-04-05 13:56:00

0

如果您的表有數據每天但where子句過濾出來,那麼最簡單的解決方案是使用有條件聚集:

SELECT SUM(dept_id = 5) as test, 
     UNIX_TIMESTAMP(my_time)*1000 as d 
FROM chat_table 
WHERE my_time >= '2015-03-30' 
GROUP BY DAY(my_time) 
ORDER BY d ASC; 

如果這些條件不成立,那麼您需要從所有日期列表開始,並使用left join