Php MYSQL组按周停止工作

Php MYSQL组按周停止工作,php,mysql,datetime,statistics,group-by,Php,Mysql,Datetime,Statistics,Group By,我在一些MYSQL上遇到了麻烦。下面的代码一直运行良好,直到一两周前,它才开始将2012年2月21日以后的任何事件组合在一起。第一次参赛是2011年9月18日,所以它已经整整一年没有参赛了 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)

我在一些MYSQL上遇到了麻烦。下面的代码一直运行良好,直到一两周前,它才开始将2012年2月21日以后的任何事件组合在一起。第一次参赛是2011年9月18日,所以它已经整整一年没有参赛了

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日停止工作?

问题在于,您使用的字段集与您选择的字段集不同。这一质疑只是碰巧奏效。我的意思是,你已经按周和年分组并选择时间值。分组实际做的是“删除”细节,并应用一个函数(在本例中为计数)将它们组成一个组

现在,您试图在分组的同时显示详细信息,这将导致错误的查询。例如,这会起作用,但不会向您显示详细信息:

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标准。如果是这种情况,那么您可以尝试运行以下(并且有点不友好)查询:


这不是有效的SQL(尽管它可以在MySQL中工作)。您不应该(被允许)在
WHERE
子句中使用
SELECT
列表中定义的别名。不,在
WHERE
子句中也不可能使用别名。我在一个
群组中使用它,它在MySQL中是有效的。我现在无法测试,但它可能只有在没有(严格的)ANSI模式设置的情况下才会运行。也许你应该在回答中加上这个。哦,你可能是对的。这是阿菲尔的默认行为,这就是为什么我这么认为。我要补充一点,谢谢你帮我指明了正确的方向。最终的工作解决方案如下
选择YEARWEEK(FROM_UNIXTIME(time))作为aWeek,COUNT(*)作为freq从prefix_table1 a内部连接prefix_table2 b在a.author=b.username按aWeek分组按aWeek排序按aWeek
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