0

テーブルの行にある日付に基づいて、MySQLテーブルから過去N週間のデータをフェッチしたいと思います。

現在の週が30番で、29、28、26、12週のデータを含む行があるとします。

今日の日付に基づいて過去2週間の行が必要な場合、それは簡単ですが、行のタイムスタンプに基づいて必要です。

したがって、N = 2の場合、29週目と28週目のすべての行が必要です。N= 3の場合、29週目、28週目、26週目が必要です。フェッチするのは、どの週でもかまいません。

PHPを使用し、推定出力に基づいて推測することでこれを行うことができますが、MySQLの機能を利用できる可能性があります。

4

2 に答える 2

2

1 つの方法は、クエリを使用して返される週のセットを取得し、そのクエリを結合可能なインライン ビューとして使用することです。

このようなもの:

SELECT t.*
  FROM (SELECT s.week FROM tab s GROUP BY s.week ORDER BY s.week DESC LIMIT 3) r
  JOIN tab t
    ON t.week = r.week

インライン ビュー (エイリアスr) は、テーブル内の N 個の最新の週の値のリストを取得します。(これは、整数の場合と同様に、週の列がソート可能であることを前提としています。

これはテーブルに結合され、ON 句を使用して、テーブルから返される行を、インライン ビューによって返される週の値と一致する週の値を持つ行に制限します。

注:列のインデックスは、week行数が多く、列のカーディナリティが高い場合に、パフォーマンスが大幅に向上する場合がありweekます。

注:大規模なテーブルでは、次の例のように、JOIN 操作を実行する場合とIN (subquery)述語を使用する場合でパフォーマンスが異なる場合があります。ほとんどの大規模なセットと私が行うクエリでは、通常、JOIN のパフォーマンスが向上することがわかりました。ただし、両方をテストして、どちらのパフォーマンスが優れているかを確認することをお勧めします。(小さなテーブルでは、どちらの方法でもあまり問題になりません。非常に大きなテーブルでは、パフォーマンスの違いが顕著になります。)

SELECT t.*
  FROM tab t
 WHERE t.week
    IN (SELECT s.week FROM tab s GROUP BY s.week ORDER BY s.week DESC LIMIT 3) r
于 2012-08-10T21:03:32.637 に答える
1

次のようなものを試してください(コードはテストされていません):

SELECT ... FROM table WHERE week IN (
    SELECT DISTINCT week FROM table ORDER BY weeks DESC LIMIT 3
)

基本的には、DISTINCTキーワードを使用して実際にデータベースにある週のリストを取得してから、を使用ORDER BY ... DESC LIMIT 3して最新の3週間を取得します。

これをサブクエリで実行したのは、データベースを呼び出してPHPで解析してから再送信するのではなく、PHPで1回の呼び出しとして使用できるようにするためです。通常、MySQLはこの方法でより高速に実行されます。

于 2012-08-10T20:46:28.383 に答える