我遇到了一些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日停止工作?
答案 0 :(得分: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条)...如果您只能显示,那么您将为所有这些记录显示哪个时间其中1条记录?
修改强>
正如@ypercube所说,以前的查询可能不起作用,具体取决于你是否强迫服务器遵守ansi标准。如果是这种情况,那么您可以尝试运行以下(并且有点不友好)查询:
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