2010-03-29 41 views
0

我需要能夠以不同的顯示類型以15分鐘的增量顯示數據。我有兩個問題給我帶來麻煩。一個半小時顯示數據,另一個顯示小時數據。唯一的問題是數據總計在查詢之間改變。它不計算在時間範圍內發生的數據,僅在時間範圍內發生。爲什麼我的MySQL Group By Hours與Half Hours文件不顯示相同的數據?

例如: 上午7:15有5件事情發生。 2在上午7:30發生,4在7:00發生。

15分鐘視圖顯示所有數據。 半小時視圖顯示上午7:00和上午7:30的數據,但忽略上午7:15。
小時顯示僅顯示上午7:00的數據

這裏是我的查詢:

$query="SELECT * FROM data WHERE startDate='$startDate' and queue='$queue' GROUP BY HOUR(start),floor(minute(start)/30)"; 

$query="SELECT * FROM data WHERE startDate='$startDate' and queue='$queue' GROUP BY HOUR(start) "; 

我如何拔出數據組像我有,但得到所有的數據包括在內?

問題是數據存儲在mysql表中的方式嗎?目前我有一個包含日期的列(2010-03-29)和一個包含時間的列(00:00)我是否需要將這些轉換爲其他東西?

回答

3

您正在解釋'group by'錯誤。你不會「分組」多個記錄,所以你可以用一個fetchrow()呼叫來獲得全部記錄。數據庫會將與group-by子句匹配的所有記錄摺疊成單個記錄。舉個簡單的遊戲得分表:

id playername score 
---------------------- 
1 John  23 
2 Fred  12 
3 Jack  9 
4 John  18 

如果你做了以下查詢:SELECT id, playername, score FROM table GROUP BY playername,你會得到以下結果集:

id playername score 
---------------------- 
1 John  23 
2 Fred  12 
3 Jack  9 

嘿! #4約翰去了哪裏?他已經消失了,因爲id#4的行與GROUP BY子句匹配,並且已經被摺疊到找到匹配的第一行(#1)。它本身並不是非常有用,現在已經丟失了與#4相關的所有數據。但是,這是聚集函數(求和,計數,平均等)來發揮作用:SELECT id, playername, SUM(score) FROM table GROUP BY playername

id playername score 
---------------------- 
1 John  41 <---notice the change (23 + 18 = 41) 
2 Fred  12 
3 Jack  9 

有了您的疑問,你有兩個選擇:

  1. 離開GROUP BY原樣,並在查詢中對所分組的數據進行任何計算(彙總,計算,平均等)。),以便獲得每個匹配時間段的聚合結果
  2. 刪除GROUP BY子句,在應用程序中執行任何想要的計算
  3. 將GROUP BY子句轉換爲查詢中的結果字段,以便您可以處理基於這些新列的代碼中的每個週期:SELECT *, HOUR(start), FLOOR(MINUTE(start)/30) FROM data
+0

選擇一個。謝謝你的幫助。製作方式更有意義,我覺得很愚蠢,但是當它的工作方式完全符合我的要求時,它會讓啞巴感覺消失。非常感謝! – stogdilla 2010-03-29 22:03:16

1

GROUP BY是錯誤的,您在查詢中不使用任何聚合函數。放下GROUP BY,數據庫現在必須猜測它應該選擇什麼記錄。數據庫不應該猜測,他們必須得到正確的答案,只有正確的答案。

更改SQL MODE並創建正確的查詢。

+0

所以你說明我正在解決錯誤的解決方案?我接近我想要但不完全是。你能指出我的正確方向:我應該如何查詢我的數據庫,以半小時和小時爲單位對記錄進行分組? – stogdilla 2010-03-29 21:08:45

相關問題