我有一个包含4列的表,idStream是文本,Duration(int)和Timestamp(datetime)。每次有人在我的网站上播放特定音频流时,都会插入一行。Stream是名称,Duration是他们正在收听的时间(秒)。我目前正在使用以下查询计算一年中每周的总收听时间:

SELECT YEARWEEK(`Timestamp`), (SUM(`Duration`)/60/60) FROM logs_main
WHERE `Stream`="asdf" GROUP BY YEARWEEK(`Timestamp`);

这是我所期望的。。。在有数据的一年中每周提供总的收听时间。
但是,我想建立一个查询,其中我有一个结果行数周,可能没有任何数据。例如,如果2006年第26周没有属于该周的行,那么我希望SUM结果为0。
有可能这样做吗?也许是通过一个日期范围的连接?

最佳答案

尝试过的一个真正的老派解决方案是设置另一个表,其中包含一组日期范围,您可以将其外部加入到分组中(在另一个表中,所有的周都包含一个开始/结束日期)。
在本例中,您只需使用一个表,其中包含来自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;

10-08 00:37