我有一个包含4列的表,id
,Stream
,即文本,Duration
(int)和Timestamp
(日期时间)。每次有人在我的网站上播放特定的音频流时都会插入一行。 Stream
是名称,Duration
是他们正在收听的时间(以秒为单位)。我目前正在使用以下查询来计算一年中每周的总听众时间:
SELECT YEARWEEK(`Timestamp`), (SUM(`Duration`)/60/60) FROM logs_main
WHERE `Stream`="asdf" GROUP BY YEARWEEK(`Timestamp`);
这符合我的预期......在有数据的一年中,每周都会提供总听音时间。
但是,我想构建一个查询,其中我有几周的结果行,可能没有任何数据。例如,如果2006年的第26周没有属于该周的行,那么我希望SUM
结果为0。
有可能这样做吗?也许是以某种方式在日期范围内加入?
答案 0 :(得分:2)
尝试过一个真正的旧学校解决方案是设置另一个表,其中包含一组日期范围,您可以将这些日期范围外部加入以进行分组(因为在另一个表中将包含其中的所有周数以及开始/结束日期)。
在这种情况下,您可以使用满是YEARWEEK值的表:
201100
201101
201102
201103
201104
这是sql语句的草图:
SELECT year_weeks.yearweek , (SUM(`Duration`)/60/60)
FROM year_weeks LEFT OUTER JOIN logs_main
ON year_weeks.yearweek = logs_main.YEARWEEK(`Timestamp`)
WHERE `Stream`="asdf" GROUP BY year_weeks.yearweek;
答案 1 :(得分:0)
这是一个建议。可能不是你想要的。
但是说你有一个简单的表,其中一列[year_week]
包含值1,2,3,4 ...
理论上你可以:
SELECT
A.year_week,
(SELECT SUM('Duration')/60/00) FROM logs_main WHERE
stream = 'asdf' AND YEARWEEK('TimeStamp') = A.year_week GROUP BY YEARWEEK('TimeStamp'))
FROM
tblYearWeeks A
这显然需要一些调整...我已经在其他项目中完成了几个类似的查询,这取决于具体情况。
如果您正在寻找一个基于表/ sql的解决方案,那么这也是我感兴趣的东西!