1

アプリケーションの統計を作成する必要があるため、可能な限り最高のパフォーマンスを発揮するアルゴリズムが必要です。いくつか質問があります。

私はmysqlデータベースに次のようなデータ構造を持っています:

user_id    group_id     date
1          5            2012-11-20
1          2            2012-11-01
1          4            2012-11-01
1          3            2012-10-15
1          9            2013-01-18
...

そのため、特定の日付のユーザーのグループを見つける必要があります。たとえば、日付2012-11-15(2012年11月15日)のユーザー1のグループは、最新のグループを返す必要があります。これは、日付2012-11-01(最も近い日付と小さい日付)。

通常、Select where date <=日付の説明で選択された日付の順序などを実行できますが、1000人のユーザーがいる場合、すべての結果を得るには1000のリクエストが必要になるため、それは重要ではありません。

だからここにいくつかの質問があります:

  1. mysqlリクエストの数が多くなるのを避けるために、すでにphpメソッドを使用して配列をループしていますが、配列のサイズが10000以上になる可能性があるため、それでも適切ではありません。foreach(またはfor?)を使用すると、かなりのコストがかかります。したがって、私の質問は、日付(descまたはasc)で並べ替えられた配列が与えられた場合、与えられた日付よりも小さい(または大きい)日付を含む要素の最も近いインデックスを見つける最も速い方法は何ですか?forまたはforeachループを使用して各要素をループすることに加えて。
  2. 最初の質問に対する解決策がない場合、この種の問題に対してどのようなデータ構造を提案しますか。

注:日付はmysql形式であり、配列に格納したときにタイムスタンプに変換されません

編集:これはSQLフィドルですhttp://sqlfiddle.com/#!2/dc28d/1 dos_id = 6の場合、t = "2012-11-01"は、日付「2010-12-」で2と5のみを返す必要があります。 10 13:16:58 "

4

2 に答える 2

2

PHPでこれを実行する理由がわかりません。代わりに結合を使用して、日付が指定されたすべてのユーザーの最新のグループを取得するSQLを次に示します。日付とユーザーIDにインデックスがあることを確認してください。

SELECT *
FROM test t1
LEFT JOIN test t2
ON t1.userid = t2.userid AND t2.thedate <= '2012-11-15' AND t2.thedate > t1.thedate
WHERE t1.thedate <= '2012-11-15' AND t2.userid IS NULL;

SQLfiddle

またはSQLFiddleを使用する

SELECT t1.*
FROM dossier_dans_groupe t1
LEFT JOIN dossier_dans_groupe t2
ON t1.dos_id = t2.dos_id AND t2.updated_at <= '2012-11-01' 
   AND t2.updated_at > t1.updated_at
WHERE t1.updated_at <= '2012-11-01' AND t2.dos_id IS NULL;
于 2013-02-04T10:20:24.500 に答える
1

これにより、指定した日付(以下の2012-11-15)よりも小さい最新の日付のすべてのユーザーとそのグループ(グループごとに1行)のリストが表示されます。

SELECT user_id, group_id, date FROM table WHERE date <= '2012-11-15' AND NOT EXISTS (SELECT 1 FROM table test WHERE test.user_id = table.user_id AND test.date > table.date and test.date <= '2012-11-15')
于 2013-02-04T10:00:35.217 に答える