1

我正在尝试根据同一语句中的星期几和一天中的时间提取数据(这样我就可以看到我每小时和一周内获得了多少次访问。这是声明。

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 小时时间线相匹配,我需要缺少的是'0'。

虽然我可以用循环在 PHP 端处理它,但在一周中的每一天以及在此之内,每小时循环它是相当烦人的,而且绝对不干净。

是否可以没有临时表(例如在查询本身中包含 24 位数字等?)?

4

2 回答 2

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())到您的原始选择中以获取仅当周的数据。

于 2012-01-04T11:43:48.970 回答
0

不知道为什么你不想使用临时表,它让生活更轻松。

解决方案最好在这里列出:http ://www.freeopenbook.com/mysqlcookbook/mysqlckbk-chp-12-sect-10.html

本质上,您必须创建一个包含一天中所有时间的表并在其上留下连接。

于 2012-01-04T11:23:31.323 回答