MySQL Group By Year结果正在发生变化

时间:2013-01-14 12:00:34

标签: mysql sql

我有一个SQL语句,它选择一系列值,然后按年/月/日对它们进行分组。这似乎工作正常。

真正令人困惑的是,如果我在第二天运行此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天的结果

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

第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月27日和2012年12月30日的结果如何。我错过了什么?我假设使用Group by函数有一个计数错误,但我不知道是什么。

NB。 这个SQL每天早上由cronjob运行。不是手工,所以我不认为这里会引起用户错误(除了在声明的创建中)。

编辑: 对不起,打印的SQL中有一个错误(我为公众稍微改了一下)。它应该是startDate每个地方。这个问题仍然存在。

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分: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);

这些更改可以改进您的查询,但此版本和原始版本的结果不应每天都有所不同。所有已更改的结果都显示较少的记录,因此我猜测用户正在删除记录。