2013-01-14 61 views
1

我有一條SQL語句可以選擇一系列值,然後按年/月/日對它們進行分組。這似乎工作正常。MySQL組按年分組結果發生變化

真正令人困惑的是,如果我在第二天運行這個SQL,結果數字會改變。我認爲總的來說,這些數字是正確的,但在不同日期運行時,它們會改變一兩次。

例如。

select Date_format(startDate, "%Y-%m-%d") as Date, count(*) as Online 
from 
`promotion` p, `subscription` s 
where 
p.`uid` = s.`uid` and 
s.`productId` = "groupproduct" 
startDate < now() 
GROUP BY YEAR(startDate), MONTH(startDate), DAYOFMONTH(startDate); 

結果上日X上一天X + 1

2012-12-25 265 
2012-12-26 264 
2012-12-27 231 
2012-12-28 187 
2012-12-29 171 
2012-12-30 8933 
2012-12-31 3114 

通知

2012-12-25 265 
2012-12-26 264 
2012-12-27 232 
2012-12-28 187 
2012-12-29 171 
2012-12-30 8935 
2012-12-31 3117 

結果如何在2012年12月27日和二○一二年十二月三十日結果是關閉一。我錯過了什麼?我認爲使用按功能分組有一個計數錯誤,但我不知道是什麼。

注意: 這個SQL每天早上都由cronjob運行。不是手動的,所以我不認爲用戶錯誤是在這裏(除了創建聲明)。

編輯: 對不起,在打印的SQL有一個錯誤(我稍微改變了它爲公衆)。它應該startDate每一個地方。問題依然存在。

+1

也許一個歷史條目的開始日期錯誤的一年!?!? – Strawberry

+0

爲什麼不向我們提供表格和樣品數據。 :)如果您正在使用開始日期然後按組分組,或按產品日期分組。 – bonCodigo

回答

0

你爲什麼按startDate分組,但輸出purchaseDate(Date_format(purchaseDate, "%Y-%m-%d"))。 MySQL將爲每個組選擇PurchaseDate什麼?

我覺得你的SQL將會是這樣的:

select Date_format(startDate, "%Y-%m-%d") as Date, count(*) as Online 
from 
`promotion` p, `subscription` s 
where 
p.`uid` = s.`uid` and 
s.`productId` = "groupproduct" 
startDate < now() 
GROUP BY Date_format(startDate, "%Y-%m-%d"); 

,或者如果你需要purchaseDate

select Date_format(purchaseDate, "%Y-%m-%d") as Date, count(*) as Online 
from 
`promotion` p, `subscription` s 
where 
p.`uid` = s.`uid` and 
s.`productId` = "groupproduct" 
startDate < now() 
GROUP BY Date_format(purchaseDate, "%Y-%m-%d"); 
+0

對不起,SQL中有一個錯誤。請參閱我的編輯。 – winna

+0

我會嘗試第一個例子,使用GROUP BY Date_format(startDate,「%Y-%m-%d」) – winna

+0

@winna歡迎來到Stack Overflow。如果這個答案適合你,請[標記爲已接受](http://stackoverflow.com/faq#howtoask) – valex

0

幾件事情。首先,是否真的有可能在startDate >= now()有記錄?這不應該導致你遇到的問題,但我只是沒有看到它的需要。其次,你的GROUP BY條款分組到每個獨特的一天,所以你爲什麼不簡單地使用GROUP BY DATE(startDate)

這兩個建議將您的查詢降低

select Date_format(startDate, "%Y-%m-%d") as Date, count(*) as Online 
from 
`promotion` p, `subscription` s 
where 
p.`uid` = s.`uid` and 
s.`productId` = "groupproduct" 
GROUP BY DATE(startDate); 

這些變化提高你的查詢,但是既沒有這個版本,也沒有原來的結果應該在某一天到一天的基礎上有所不同。所有已更改的結果都顯示較少的記錄,因此我猜測用戶正在刪除記錄。