MySQLをデータベースとして使用するアプリケーション用に書き直しているレポートがあります。現在、レポートはphpからの多くの不平を言う作業を使用しています。これは、配列を作成し、それらを一時データベースに再格納してから、その一時DBから結果を生成します。
このすべてのコードの大部分を書き直すことの主な目標の1つは、古いコードの多くを単純化してクリーンアップすることであり、以下のプロセスを単純化できるかどうか、またはphpにクライアントへのデータ。
作成したシナリオを使用して、私がやろうとしていることを説明します。
次のテーブルを想定しましょう(実際のアプリでは、このテーブルの情報は実際にはいくつかのテーブルから取得されますが、わかりやすくするためにポイントを理解する必要があります)。
+----+-----------+--------------+--------------+
| id | location | date_visited | time_visited |
+----+-----------+--------------+--------------+
| 1 | place 1 | 2012-04-20 | 11:00:00 |
+----+-----------+--------------+--------------+
| 2 | place 2 | 2012-04-20 | 11:06:00 |
+----+-----------+--------------+--------------+
| 3 | place 1 | 2012-04-20 | 11:06:00 |
+----+-----------+--------------+--------------+
| 4 | place 3 | 2012-04-20 | 11:20:00 |
+----+-----------+--------------+--------------+
| 5 | place 2 | 2012-04-20 | 11:21:00 |
+----+-----------+--------------+--------------+
| 6 | place 1 | 2012-04-20 | 11:22:00 |
+----+-----------+--------------+--------------+
| 7 | place 3 | 2012-04-20 | 11:23:00 |
+----+-----------+--------------+--------------+
必要なレポートでは、最初に各場所をリストし、次にその場所への訪問数をリストする必要があります。ただし、注意点と私にとってクエリを困難にしているのは、このレポートでカウントするために訪問のために満たされる時間間隔が必要であるということです。
例:特定の場所への訪問の間隔が10分であるとします。
最初のエントリは前のエントリがないため自動的にロックインされ、2番目のエントリは'place2'の他のエントリがまだないためロックインされます。ただし、3番目のエントリでは、場所1が最後にアクセスされた時刻がチェックされます。これは、定義された間隔(10分)よりも短いため、レポートはこのエントリを無視して次のエントリに移動します。
基本的に、時間間隔が最後のエントリからではなく、同じ場所からの最後のエントリからであるケースバイケースのシナリオをチェックしています。
レポートの結果は、最終的に次のようになります。
+----+-----------+--------+
| id | location | visits |
+----+-----------+--------+
| 1 | place 1 | 2 |
+----+-----------+--------+
| 2 | place 2 | 2 |
+----+-----------+--------+
| 3 | place 3 | 1 |
+----+-----------+--------+
基本レベルでの現在の実装では、上記の結果セットを取得するために次の手順を実行します。
- MySQLクエリは、必要なすべての場所とそのIDのリストを含む1つの一時テーブルを作成します。
- MySQLクエリは、指定された時間枠内のすべての訪問データを選択し、それをPHPに渡します。
- PHPとMySQLは一時テーブルに訪問データを入力し、PHPはここでうなり声を上げます。
- MySQLは一時テーブルからデータを選択し、表示のためにクライアントに返します。
私の質問はです。MySQLだけでこれのほとんどを行う方法はありますか?私が見つけようとしているのは、selectステートメントを解析して上記の基準を満たす訪問のみを選択し、最後に場所ごとにグループ化してCOUNT(*)を提供するMySQLクエリを作成する方法です。各グループ。
私はそれが可能かどうか本当にわかりません、そしてそこにいるデータベースの達人の一人がこれを行う方法にいくらかの光を当てることができるかもしれないことを望んでいます。