2011-02-17 73 views
2

我有一个包含4列的表格id,Stream这是文本,Duration(int)和Timestamp(日期时间)。每当有人在我的网站上播放特定的音频流时,都会插入一行。 Stream是名称,Duration是他们正在监听的时间。我目前使用下面的查询,以总听小时,每星期的身影了一年:GROUP BY具有日期范围

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

这做什么,我希望......在今年呈现累计播放时间为每星期有数据。

不过,我想建立一个查询在那里我有一个结果行数周,有可能没有任何数据。例如,如果2006年的第26周没有那一周内的行,那么我希望SUM的结果为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; 
+0

谢谢。我最终找到了一种替代解决方案(与我所问的完全不同,否则我会在这里发布),但我将在未来简单地使用这种方法。这太糟糕了,没有办法直接在查询中生成YEARWEEK数据集。 – Brad 2011-02-18 01:39:27

0

这里是一个建议。可能不是你正在寻找的东西。

但是说你有一个简单的表有一列[year_week]包含的1,2,3,4 ... 52

你能值那么理论上:

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解决方案则是deffinately东西,我有兴趣的!

+0

我可能失去了一些东西,但我没有看到,你实际上是在加入到tblYearWeeks ...... – RQDQ 2011-02-17 20:19:45