我有一个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每个地方。这个问题仍然存在。
答案 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);
这些更改可以改进您的查询,但此版本和原始版本的结果不应每天都有所不同。所有已更改的结果都显示较少的记录,因此我猜测用户正在删除记录。