可能有太多的解决方案,具体取决于业务逻辑和您希望如何呈现它。
1) 将time 字段分配给date 和time,然后按date 分组:
SELECT AVG(sz.occupied), AVG(sz.free), date, time
FROM `hourly_cache` AS sz
WHERE
(sz.date >= '2017-01-01' AND sz.date < '2017-01-07')
AND HOUR(sz.time) BETWEEN 8 AND 22
AND libID = 0
GROUP BY date;
2)将时间转换为日期并按日期分组:
SELECT AVG(sz.occupied), AVG(sz.free), DATE(sz.time) as date
FROM `hourly_cache` AS sz
WHERE
(sz.time >= '2017-01-01 00:00:00' AND sz.time < '2017-01-07 00:00:00')
AND HOUR(sz.time) BETWEEN 8 AND 22
AND libID = 0
GROUP BY date;
3)使用DAYOFWEEK函数
SELECT AVG(sz.occupied), AVG(sz.free), DAYOFWEEK(sz.time) as day_of_week
FROM `hourly_cache` AS sz
WHERE
(sz.time >= '2017-01-01 00:00:00' AND sz.time < '2017-01-07 00:00:00')
AND HOUR(sz.time) BETWEEN 8 AND 22
AND libID = 0
GROUP BY day_of_week;
4) 将day_of_week 和week_num 字段添加到hourly_cache 表中,在插入或更新时设置它们。
然后像这样查询它:
SELECT AVG(sz.occupied), AVG(sz.free), week_num, day_of_week
FROM `hourly_cache` AS sz
WHERE
(sz.time >= '2017-01-01 00:00:00' AND sz.time < '2017-01-07 00:00:00')
AND HOUR(sz.time) BETWEEN 8 AND 22
AND libID = 0
GROUP BY week_num, day_of_week;
5)如果你不能改变表结构你可以创建一个视图(但我不确定性能):
CREATE VIEW v_avarage_seats_by_date AS
SELECT
AVG(sz.occupied) as occupied,
AVG(sz.free) as free,
DATE(sz.time) as date,
DAYOFWEEK(sz.time) as day_of_week
FROM `hourly_cache` AS sz
WHERE
(HOUR(sz.time) BETWEEN 8 AND 22) AND libID = 0
GROUP BY date;
然后像这样查询它:
SELECT * FROM v_avarage_seats_by_date WHERE date >= '2017-01-01' AND date =< '2017-01-07'