0

そのような列を含むテーブルがあります:

id、person_id、pet_id、description

このテーブルに関するいくつかのステートメントがあります。

  1. idは主キー、自動インクリメントです
  2. 各ペア(person_id、pet_id)は一意です
  3. id、person_id、pet_idは整数であり、NULLではありません
  4. 「穴」が発生する可能性があります(最大pet_idは、そのようなperson_idを持つ列の総数が(最大)であることを示していません)
  5. テーブルには、各人のpet_idの平均数であるperson_idがはるかに異なる可能性があります。

問題は、現在のperson_idのランダムなN pet_idを高速に選択する方法ですか?

表の例:

1.  1   1     cat
2.  1   2     dog
3.  2   40    horse
4.  2   35    dog
5.  3   46    duck
6.  2   39    duck
7.  1   3     duck
..................
100000  403  12  monkey

例:個人番号2に対して2つのRANDOM行を選択したいと思います。考えられるランダムな選択肢の1つは、行#3です。そして行#6。選択肢は実際には「ランダム」である必要があります(同じ確率で表示される必要があります)。

mysqlクエリSELECTを使用してそれを行う方法は?

PSもちろん、テーブルからランダムな行をいくつか選択することについて読んだことがあります。これは、いくつかのトリッキーなソリューションの基本的な問題です。しかし、私の場合、1つではなく2つの行があります。

私はより速い方法を考えています

select id from tablename where person_id = 2 order by random()  limit 2;
4

2 に答える 2

1

あなたのストローマン クエリはできる限り優れています。たくさんのペットを飼っている人がいない場合 (そして にインデックスがある場合person_id)、非常に高速に実行されるはずです。そんな人がいたら、あなたは不幸です。無作為に選択することを忘れて、そのような人が何匹のペットを飼っているかを決定するのに O(# ペット) の時間を必要とします。

おそらくうまくいかない可能性のある他のアイデアの1つ:選択の独立性を気にしない場合(つまり、毎回同じランダムな応答が得られる可能性がある場合)、列を追加して、行が挿入されるときの乱数。にインデックスを追加し、person_id,random_columnそのペアで並べ替えられた最初の N 行を選択します。複数のランダムな列を追加し、1 つを選択してランダムに並べ替えることをお勧めします。残念ながら、これはうまくスケーリングできず、結果に満足できないと思います。

于 2013-01-06T00:07:45.767 に答える
0

これを試してください。ここでは、データベースでのrandom()関数の実行時間を短縮しています。

 $max_sql = "SELECT max(id) AS max_id  FROM " . $table;
  $max_row = mysql_fetch_array(mysql_query($max_sql));
  $random_number = mt_rand(1, $max_row['max_id']);

  $random_sql = "SELECT * FROM " . $table . "
                 WHERE " . $column . " >= " . $random_number . " 
                 ORDER BY " . $column . " ASC
                 LIMIT 1"; 
于 2013-01-05T22:32:25.550 に答える