2012-01-04 71 views
1

我試圖根據星期幾的&還小時一天在同一個語句的(這樣我就可以看到我每小時超過一個星期有多少人訪問了提取數據,以下聲明。MySQL如何填補範圍內缺失的小時/日期?

SELECT 
count(id) as count, 
HOUR(created) as hour_of_day, 
WEEKDAY(created) as day_of_week, 
DATE_FORMAT(created,'%W') name_of_day 
FROM visitors 
GROUP BY day_of_week,hour_of_day 
ORDER BY day_of_week,hour_of_day ASC 

一些樣本數據

count hour_of_day day_of_week name_of_day 
    2  0   0   Monday 
    1  1   0   Monday 
    1  4   0   Monday 
    4  5   0   Monday 
    1  6   0   Monday 
    4  7   0   Monday 
    1  9   0   Monday 
    1  10   0   Monday 
    1  12   0   Monday 
    1  13   0   Monday 
    2  16   0   Monday 
    5  18   0   Monday 
    5  19   0   Monday 

問題 正如你可以看到,有數據丟失在數據幾個小時。而作爲我創建這在[X的形式需要數據的圖,X ,x,x,x,x,x],這將與24小時時間軸st相匹配從第一個輸出創作出來,我需要缺失的那個爲'0'。

雖然我可以在PHP端使用循環來處理它,但在每週的每一天都會循環使用它,因爲每個小時都是相當煩人的,而且絕對不乾淨。

是否有可能沒有臨時表(如包括查詢本身的24位數字?)?

回答

2

不是最漂亮的。但它應該做的伎倆,如果你真的不能使用臨時表:

select ifnull(count,0) as count,dh.hour_of_day, 
dh.day_of_week,date_format((date('2012-01-02') + interval dh.day_of_week day),'%W') as name_of_day 
from 
(
select day_of_week,hour_of_day 
from 
(
select 0 as day_of_week union select 1 union select 2 union select 3 
union select 4 union select 5 union select 6 
) d 
join 
(
select 0 as hour_of_day 
union select 1 union select 2 union select 3 union select 4 
union select 5 union select 6 union select 7 union select 8 
union select 9 union select 10 union select 11 union select 12 
union select 13 union select 14 union select 15 union select 16 
union select 17 union select 18 union select 19 union select 20 
union select 21 union select 22 union select 23 
) h 
) dh 
left outer join 
(
SELECT 
count(id) as count, 
HOUR(created) as hour_of_day, 
WEEKDAY(created) as day_of_week, 
DATE_FORMAT(created,'%W') name_of_day 
FROM visitors 
GROUP BY day_of_week,hour_of_day 
) v on dh.day_of_week = v.day_of_week and dh.hour_of_day = v.hour_of_day 
ORDER BY dh.day_of_week,dh.hour_of_day ASC; 

雖然小心!如果您在多個星期內運行查詢,那麼一週中的多天將被添加到一起。您可能需要考慮添加「僅本週」謂詞。例如,將where yearweek(created) = yearweek(now())添加到原始選擇中即可獲取當前星期的數據。

2

不知道爲什麼你不想使用臨時表,它使生活變得更容易。

的解決方案是最好的位置佈局:http://www.freeopenbook.com/mysqlcookbook/mysqlckbk-chp-12-sect-10.html

從本質上講,你需要創建一個表,在一天的所有時間和左的連接就可以了。

+1

雖然這可能在理論上回答這個問題,但[這將是更可取的](http://meta.stackexchange.com/q/8259)在這裏包括答案的基本部分,並提供參考鏈接。 (另外:鏈接被破壞) – Nanne 2013-06-25 11:41:17