2012-03-06 57 views
0

我遇到了一些MYSQL问题。下面的代码一直工作得很好,直到一两周前,它开始将任何比2012年2月21日更新的任何内容分组在一起。第一个入口是2011年9月18日,所以它没有运行一整年。MYSQL Group by weekofyear停止工作

SELECT dept, time, COUNT(*) AS freq 
FROM prefix_table1 a 
INNER JOIN prefix_table2 b b ON a.author = b.username 
GROUP BY WEEKOFYEAR(DATE(FROM_UNIXTIME(time))) 
ORDER BY time ASC 
LIMIT 24 

我想用这个查询来实现的所有我想要检索在每周发生的条目数。

有一次,我在PHP中处理UNIX邮票以获取年份中的星期数,并将其后缀为年,以允许统计数据运行超过12个月。

问题是 - 我哪里出错了?为什么它在2012年2月21日停止工作?

回答

2

问题是,您正在按照您选择的不同字段进行分组。该查询只是偶然发挥作用。我的意思是,你一直在按WEEKOFYEAR分组并选择时间值。分组实际上做的是“移除”细节,并与他们组合应用一个函数(在这种情况下计数)。

现在,您尝试在同时进行分组时显示详细信息,并导致查询错误。举例来说,这会工作,但不会告诉你一个细节:

SELECT dept, WEEKOFYEAR(DATE(FROM_UNIXTIME(time))) as aWeek, COUNT(*) AS freq 
FROM prefix_table1 a 
INNER JOIN prefix_table2 b b ON a.author = b.username 
GROUP BY dept, aWeek 
ORDER BY aWeek 
LIMIT 24 

原始查询的逻辑错误的一个明显的例子是:如果你已经分组,比方说,20条记录(计数会显示器20)...如果只能显示其中一个记录,您将显示哪一个时间?

编辑:

正如@ypercube说,以前的查询可能不取决于如果你迫使服务器尊重ANSI标准或无法正常工作。如果是这样的话,那么你可以尝试运行以下(和一点点unfriendlier)查询:

SELECT dept, WEEKOFYEAR(DATE(FROM_UNIXTIME(time))) as aWeek, COUNT(*) AS freq 
FROM prefix_table1 a 
INNER JOIN prefix_table2 b b ON a.author = b.username 
GROUP BY dept, WEEKOFYEAR(DATE(FROM_UNIXTIME(time))) 
ORDER BY aWeek 
LIMIT 24 
+0

这不是有效的SQL(尽管它可能在MySQL的工作)。你不应该(被允许)在'WHERE'子句中使用,它是'SELECT'列表中定义的别名。 – 2012-03-06 23:44:36

+0

不,不可能在'WHERE'子句中使用别名。我在'GROUP BY'中使用它,它在MySQL中有效。 – 2012-03-06 23:47:48

+0

我现在无法测试,但只有在没有(严格)ANSI MODE设置的情况下才能运行。也许你应该在你的答案中加上。 – 2012-03-06 23:49:45