0

ユーザーデータからの入力を保存し、送信された各フォームにタイムスタンプを追加する MySQL テーブルがあります。

通常、フォームは毎日送信されますが、ユーザーは 1 日に複数回送信することもできます。

過去 6 週間のデータを示すグラフを表示する必要があります。または、6 週間のデータに十分なデータ ポイント (40) が含まれていない場合は、ポイント数を制限する必要があります (以前の日付からデータ ポイントを取得できます)。

これを 1 つのクエリで実行できますか、それとももっと複雑な SQL に頼るべきでしょうか、それともさらに悪いことに、Python/PHP/C++/... に頼らなければならないのでしょうか?

要約:

  • 最低 6 週間のデータ
  • 選択した範囲で 40 個のデータ ポイントが利用できない場合 -> タイムスタンプの制限に関係なく、最後の 40 個を取得します。

明確化:

  • 時間範囲の要素数が 60 の場合、その 60 要素が必要です。
  • 時間範囲の要素数が 30 の場合、最後の 40 要素が必要です。
4

3 に答える 3

1
select t2.* from  (
 SELECT t.*, 
   @rownum := @rownum + 1 AS rownumber
 FROM YOUR_TABLE t, 
   (SELECT @rownum := 0) r
 ORDER BY timestamp
) as t2
where t2.rownumber<=40 or t2.timestamp >= '6-week-date'
于 2013-08-19T17:11:10.287 に答える
1

たった 1 つのクエリでこれを実現する方法は確かにたくさんありますが、効率的に実行できるとは思えません。テーブルが日付/時刻フィールドでインデックス化されていると仮定すると、次のようなクエリは事実上瞬時に実行されます。

SELECT COUNT(dateField) FROM myTable
WHERE dateField >= DATE_SUB(NOW(), INTERVAL 6 WEEK);

次に、2 つのパスに進み、上記のクエリの戻り値に応じて、これら 2 つのバージョンのいずれかを起動します。

-- if previous query returned < 40
SELECT * FROM myTable
ORDER BY dateField DESC
LIMIT 40;

また

-- if previous query returned >= 40
SELECT * FROM myTable
WHERE dateField >= DATE_SUB(NOW(), INTERVAL 6 WEEK);

注意事項:

  • NOW()プロセスの最初に計算するリテラル値に置き換える必要があります(そうしないとWHERE、時間が経過するのと同じ条件でフィルタリングされません)

  • 最初のステートメントは、実際のデータ (2 番目のクエリ) を取得するまで干渉を防ぐために、SELECT実際にはロックステートメントである必要があります。SELECT ... FOR UPDATEもちろん、これは 1 つのトランザクション内で発生します。

于 2013-08-19T17:33:34.780 に答える
0

私は次のようにします:

SELECT t.*
  FROM mytable t
 CROSS 
  JOIN ( SELECT COUNT(1) AS cnt
           FROM mytable ct
          WHERE c.submitted_timestamp >= NOW() + INTERVAL -6 WEEK
       ) c
 WHERE ( c.cnt <= 40 )
    OR ( c.cnt > 40 AND t.submitted_timestamp >= NOW() + INTERVAL -6 WEEK )
 ORDER
    BY t.submitted_timestamp DESC
 LIMIT 40 

インライン ビュー (c上記のエイリアスが割り当てられている) は、指定された期間 (6 週間) 内のタイムスタンプ付きの数のカウントを返します。

外側のクエリの WHERE 句のカウントに返された値を使用します。カウントが 40 未満の場合、他の述語は含めません (すべての行を取得します)。

カウントが 40 を超える場合は、追加の述語が含まれます。

ORDER BY は、最新の行が最初にあることを保証します。LIMIT により、返される行が 40 行を超えないことが保証されます。

(先頭の列が のインデックスは、submitted_timestampパフォーマンスを向上させる可能性があります。

于 2013-08-19T19:00:21.213 に答える