1

値の範囲を選択し、それらを年/月/日でグループ化するSQLステートメントがあります。これは正常に機能しているようです。

本当に紛らわしいのは、このSQLを翌日に実行すると、結果の数値が変わることです。全体的には正しいと思いますが、異なる日に実行すると1つか2つ変化します。

例えば。

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日の結果が1つずれていることに注目してください。私は何が欠けていますか?Group by関数を使用してカウントエラーがあると思いますが、何がわかりません。

NB。このSQLは、毎日午前中にcronjobによって実行されます。手作業ではないので、ここでユーザーエラーが原因であるとは思いません(ステートメントの作成を除く)。

編集:申し訳ありませんが、印刷されたSQLに誤りがありました(私は一般向けに少し変更しました)。どこでもstartDateである必要があります。問題はまだ残っています。

4

2 に答える 2

0

いくつかのこと。まず、でレコードを作成することは本当に可能startDate >= now()ですか? これで問題が発生することはありませんが、その必要性がわかりません。第二に、あなたのGROUP BY句はそれぞれのユニークな日にグループ化されているので、単純に使用しないのはなぜGROUP BY DATE(startDate)ですか?

これらの 2 つの提案は、クエリを

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);

これらの変更によりクエリは改善されますが、このバージョンとオリジナルのどちらの結果も日々変化することはありません。変更されたすべての結果は、より少ないレコードを示しているため、ユーザーがレコードを削除していると推測できます。

于 2013-01-14T13:52:14.523 に答える
0

なぜグループ化するのにstartDate出力するのですかpurchaseDate (Date_format(purchaseDate, "%Y-%m-%d"))PurchaseDateMySQL は各グループに何を選択しますか?

あなたの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");
于 2013-01-14T12:44:14.447 に答える