0

データ分析を目的として、さまざまな統計についてグラフを描く練習をしていました。しかし、バックエンドで複数のmysqlクエリを起動する効率的な方法を見つけることができません。

期間と訪問数のグラフを描画しようとしています。注意: ここでの期間は、週、月、3 か月、6 か月、1 年、2 年を指します。期間はユーザーがセレクトボックスから選択します。例: ユーザーが 3 週間を選択した場合、3 週間あたりの訪問者数のグラフを作成する必要があります。 ここに画像の説明を入力

私のデータベースには 2 つの列が含まれています: ヒットしたサイトごとに、以下が記録されます。

(1)タイムスタンプ

(2)ユーザーID .

選択オプションごとにクエリを複数回起動すると、パフォーマンスが大幅に低下します。効率的に行うにはどうすればよいですか?

UPD: ユーザーが 3 か月ごとの統計を選択した場合:

次に、mysqlクエリを次のように起動しています:

Select count(*) From stats_tab WHERE timestamp BETWEEN JAN  AND MAR;
Select count(*) From stats_tab WHERE timestamp BETWEEN APR AND JUN;
Select count(*) From stats_tab WHERE timestamp BETWEEN JUL AND SEP;
............

各クエリから返される各カウントは、グラフの y 軸の値になります

ユーザーが年ごとの統計を選択する場合: 次に、mysql クエリを次のように実行します。

    Select count(*) From stats_tab WHERE timestamp BETWEEN 2009 AND 2010;
    Select count(*) From stats_tab WHERE timestamp BETWEEN 2010 AND 2011;
    Select count(*) From stats_tab WHERE timestamp BETWEEN 2011 AND 2012;
    ............
4

1 に答える 1

1

複数のクエリでデータベースをヒットしないでください。1 つのクエリを適切に適用してすべての値を取得GROUP BYするWHERE

SELECT YEAR(timestamp) year, COUNT(*) total
  FROM stats_tab 
 WHERE timestamp BETWEEN NOW() - INTERVAL 3 YEAR AND NOW()
 GROUP BY YEAR(timestamp);

SELECT MONTH(timestamp) month, COUNT(*) total
  FROM stats_tab 
 WHERE timestamp BETWEEN NOW() - INTERVAL 6 MONTH AND NOW()
 GROUP BY MONTH(timestamp);

SELECT DAY(timestamp) day, COUNT(*) total
  FROM stats_tab 
 WHERE timestamp BETWEEN NOW() - INTERVAL 7 DAY AND NOW()
 GROUP BY DAY(timestamp);

出力例:

| | 年 | 年 | 合計 |
----------------
| | 2011年 | 2 |
| | 2012年 | 1 |
| | 2013年 | 9 |

| | 月 | 月 | 合計 |
-----------------
| | 2 | 1 |
| | 3 | 2 |
| | 5 | 1 |

| | 日| 合計 |
---------------
| | 20 | 1 |
| | 21 | 1 |
| | 22 | 1 |

これがSQLFiddleのデモです

于 2013-07-23T09:38:54.183 に答える