0

まず、質問に正しく名前を付けたかどうかはわかりませんが、正しく呼び出す方法がわかりません:/

私はこのクエリを持っています:

SELECT COUNT( id ), jumper, `date` FROM demosdb WHERE jumperid = '1053' GROUP BY `date`
ORDER BY  `COUNT(id)` DESC

基本的にdemosdbは:

id (int), jumperid (int), date (int (basically contains timestamp))

ここまでは順調ですね。ただし、一部のレコードにはわずかな違いがあります (自動スクリプトを使用して更新し、場合によっては時間 +/-5 を設定します。たとえば、そのクエリの結果:

COUNT(id)   date
10  1318763642
10  1318763643
10  1318763639
9   1318763641
9   1318763637
8   1318763640
8   1366200434

最初の行の時間がほぼ同じであることがわかりますが、5 秒の差 (37 から 42) があります。+/-60 秒 (およびそれ以上) が同じものの一部であることは 100% 確実1234567890です12345678%。それはmysqlだけで可能ですか、それともphpに頼るべきですか?

4

3 に答える 3

1

SQL でのグループ化は、まったく同じ値に依存しており、近いまたは類似していません。grouping bydate/60で分のブロックをグループ化することでおそらくこれをハックできますが、それでもまだしきい値の問題があります (60 秒目の何かが、次の分の最初の 1 秒の何かとは別のブロックにあるでしょう)。そのため、よりスマートなアルゴリズムを使用して PHP でこれを行うことを強くお勧めします。すべての行を比較し、前の行と 10 秒または 20 秒以上のギャップがある場合はブロックを閉じます。

そうは言っても、クエリにはバグがあります。GROUP BYグループ化されていないすべての列を使用する場合、それらをグループ化する方法をDBMS に指示する集計関数 (maxまたは など) が必要です。あなたの場合、 columnに対してこれを行っていないため、基本的にランダムな結果が含まれます (論理的に見えることがよくあります)。MySQL は歴史的にこれを許可する唯一の DBMS ですが、他のすべてのデータベース サーバーでは致命的なクエリ エラーです。最近の MySQL は、これをエラーと見なす厳密モードをサポートしており、将来的にはこの動作がデフォルトになると確実に想定する必要があります。そのため、将来の破損を防ぐために、今すぐ変更する必要があります。avgjumper

次のようなものが機能します。

$threshold = 60;
$results = [];
$block = 0;
while($row = mysql_fetch_object($query))
{
  if($row->date - $block > $threshold)
    $block = $row->date;
  $results[$block] += $row->count; 
}

(非推奨mysql_のコマンドを使用して申し訳ありません。迅速な擬似コードが最も簡単です)

于 2013-04-25T16:42:47.527 に答える
1

負の丸め値を使用して何かを実行できる場合がありROUNDます。これは、小数点以下の右ではなく左に丸められます。たとえば、 を使用すると、結果の日付は次のようになりますROUND(date, -1)

date        round(date, -1)
----------  ---------------
1318763642  1318763640
1318763643  1318763640
1318763639  1318763640
1318763641  1318763640
1318763637  1318763640
1318763640  1318763640
1366200434  1366200430
于 2013-04-25T16:43:30.303 に答える
0

近くで強調表示されている潜在的な欠陥を受け入れると、代替ソリューションは次のようになります...

SELECT FLOOR(date/60)*60 dt
     , COUNT(DISTINCT jumperid) ttl 
  FROM jumpers 
 GROUP 
    BY dt;
于 2013-05-06T10:24:43.883 に答える