2013-02-12 57 views
2

我試圖計算每小時分組的條目。 我發現了一些有用的信息通知不同的網站和這裏:MySQL Group By HoursMysql結果每小時的數據

但結果不是我所期望的。 用下面的代碼我得到:

SELECT CONCAT(Hour, ':00-', Hour+1, ':00') AS Hours, 
    COUNT(`usage_time`) AS `usage` FROM `usage` 
    RIGHT JOIN (
        SELECT 0 AS Hour 
     UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 
     UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 
     UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 
     UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 
     UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 
     UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 
     UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21 
     UNION ALL SELECT 22 UNION ALL SELECT 23 
)  AS AllHours ON HOUR(`usage_time`) = Hour 

WHERE `usage_function` LIKE 'PlayedWholeSong' AND `usage_date` = DATE_SUB(CURDATE(), INTERVAL 0 DAY) OR `usage_time` IS NULL 
GROUP BY Hour 
ORDER BY Hour 

結果:

Hours  usage 
2:00-3:00 0 
4:00-5:00 6 
6:00-7:00 2 
8:00-9:00 3 
9:00-10:00 20 
10:00-11:00 1 
14:00-15:00 14 
15:00-16:00 1 
16:00-17:00 32 
17:00-18:00 10 

由於這些條目的從今天開始,我沒有19:00以後的任何條目。 此外,我在00:00 - 01:00,03:00 - 04:00沒有看到任何輸入,其他幾個都沒有輸入。 但是我確實希望每24小時顯示一個列表和結果,即使沒有任何結果。 String的結果是在02:00 - 03:00之間顯示0。 今天我學到了很多關於mysql的知識,但沒有解決我的問題。

我希望你能學到一些東西,不一定是代碼,方向會很棒。

+0

你想如何管理'空'使用時間? – 2013-02-12 18:13:22

+0

就像我建議儘可能在db中做的那樣,你最好在db中做一個標準的'select hour(usage_time),... group by hour(usage_time)',然後填入「洞「在您的客戶端顯示邏輯。另外,你的where子句需要工作。你已經用2或2進行鏈接,並且沒有括號來告訴mysql如何執行邏輯。是(a和b)還是c',還是'a和(b或c)'? – 2013-02-12 18:18:56

回答

1

我個人比較喜歡LEFT JOIN而不是RIGHT JOIN。這樣,您可以在JOIN中添加WHERE條件,並且不會收縮您的結果。試試這個:

SELECT CONCAT(Hour, ':00-', Hour+1, ':00') AS Hours, 
    COUNT(`usage_time`) AS `usage` 
FROM 
    (
     SELECT 0 AS Hour 
     UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 
     UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 
     UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 
     UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12 
     UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL SELECT 15 
     UNION ALL SELECT 16 UNION ALL SELECT 17 UNION ALL SELECT 18 
     UNION ALL SELECT 19 UNION ALL SELECT 20 UNION ALL SELECT 21 
     UNION ALL SELECT 22 UNION ALL SELECT 23 
)  AS AllHours 
     LEFT JOIN `usage` ON HOUR(`usage_time`) = Hour 
      AND `usage_function` LIKE 'PlayedWholeSong' 
      AND `usage_date` = DATE_SUB(CURDATE(), INTERVAL 0 DAY) 
GROUP BY Hour 
ORDER BY Hour 

這是一個簡化的SQL Fiddle

祝你好運。

+0

謝謝你用JOIN打開我的眼睛,並指向我這個漂亮的網站。我現在要再練習一些。 該死的,用LEFT JOIN閱讀起來很容易:D – Gaston 2013-02-12 21:52:38

+0

@Gaston - 沒問題,很高興能幫上忙! – sgeddes 2013-02-12 21:56:20