2012-03-06 53 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