2014-02-17 103 views
1

我想查詢的平均列值在表中按小時過去24小時。我有甚至沒有記錄的時間顯示結果的麻煩(在這種情況下,我應該打印0的平均值)MySQL的按小時得到記錄數,連時間沒有記錄

這是我到目前爲止有:

SELECT HOUR(time), AVG(score) FROM place_rvw WHERE time >= NOW() - INTERVAL 1 DAY AND place_id = 1 ORDER BY HOUR(time); 

現在(12點),例如,我的唯一記錄是9PM和10PM。因此,結果中只有兩行。我希望它有24行(代表過去24小時中的每一行),如果一個小時沒有記錄,則只顯示0的平均值。

任何形式的幫助表示讚賞。謝謝!

編輯 我試過下面喜歡什麼斯蒂芬提出的查詢,但它仍然顯示了同樣的結果。理想的結果應該有24行代表每個小時。有什麼建議麼?

SELECT za_hours.za_hour as hour, AVG(IFNULL(score,0)) as average_score 
    FROM (
    SELECT 0 as za_hour 
    UNION 
    SELECT 1 as za_hour 
    UNION 
    SELECT 2 as za_hour 
    UNION 
    SELECT 3 as za_hour 
    UNION 
    SELECT 4 as za_hour 
    UNION 
    SELECT 5 as za_hour 
    UNION 
    SELECT 6 as za_hour 
    UNION 
    SELECT 7 as za_hour 
    UNION 
    SELECT 8 as za_hour 
    UNION 
    SELECT 9 as za_hour 
    UNION 
    SELECT 10 as za_hour 
    UNION 
    SELECT 11 as za_hour 
    UNION 
    SELECT 12 as za_hour 
    UNION 
    SELECT 13 as za_hour 
    UNION 
    SELECT 14 as za_hour 
    UNION 
    SELECT 15 as za_hour 
    UNION 
    SELECT 16 as za_hour 
    UNION 
    SELECT 17 as za_hour 
    UNION 
    SELECT 18 as za_hour 
    UNION 
    SELECT 19 as za_hour 
    UNION 
    SELECT 20 as za_hour 
    UNION 
    SELECT 21 as za_hour 
    UNION 
    SELECT 22 as za_hour 
    UNION 
    SELECT 23 as za_hour 
) za_hours 
LEFT JOIN place_rvw 
    ON za_hours.za_hour = HOUR(time) 
    AND 
    time >= NOW() - INTERVAL 1 DAY 
    AND place_id = 1 
GROUP BY 
    za_hours.za_hour 
ORDER BY za_hours.za_hour 

回答

0

你的WHERE語句是保持它顯示包含0使用的行或在WHERE語句做這樣的事情:或時間= 0

+0

行不包含0,那個時間段沒有行。 –

+0

啊我誤解了那部分。 – Screech129

+0

感謝您的回答。爲什麼我添加了條款AND place_id = 1的原因是因爲我只想顯示具有該外鍵的結果。用OR替換AND會產生不正確的結果。 – galibee

1

你需要的東西,如:

SELECT 
    za_hours.za_hour, 
    AVG(IFNULL(score,0)) 
FROM (
    SELECT 0 as za_hour 
    UNION 
    SELECT 1 as za_hour 
    ... 
    SELECT 23 as za_hour 
) za_hours 
LEFT JOIN place_rvw 
    ON za_hours.za_hour = HOUR(time) 
WHERE 
    time >= NOW() - INTERVAL 1 DAY 
    AND place_id = 1 
GROUP BY 
    za_hours.za_hour 
ORDER BY za_hours.za_hour 

za_hours是包含了所有的時間(0,1 ... 24),這樣,當你有一定的時間沒有記錄,你仍然會有結果(即使它們將是零)TMP表

+0

謝謝!這可能是解決方案。但是,我可以問一下,如何確定臨時表中的過去24小時?例如,現在的時刻是凌晨2點。因此,我應該包括3AM(昨天)直到這個小時。 – galibee

+0

@galibee在臨時表中,你將永遠有,24小時,在時間上的限制是通過把條件對'time'列做,你已經'時間> = NOW() - 時間間隔1天' – Stephan

+0

明白了我認爲它會工作,但它仍然顯示相同的結果。 – galibee

2

1)創建一個24行的表格,每個表格一個小時。

2)請與你的表左outter加入。

解決方案的工作作爲展示在此: SQL fiddle

你仍然沒有得到結果,由於過濾

+0

是的,我試過這個,就像斯蒂芬建議的那樣,但是它顯示了相同的結果。用於設置0值的IFNULL功能也不起作用。 – galibee

+0

我的編輯和小提琴鏈接,解決方案的作品! – jean

+0

謝謝。得到它了。我只是將where子句條件添加到了LEFT JOIN部分(請參閱我的帖子編輯)。 – galibee

0

嘗試改變這一點:

WHERE 
    time >= NOW() - INTERVAL 1 DAY 
    AND place_id = 1 

這樣:

WHERE 
    (time >= NOW() - INTERVAL 1 DAY 
    or time is null) 
    AND place_id = 1