3

私はこれに似たテーブルを持っています: http://sqlfiddle.com/#!2/8c877

例として、「ユーザー」によって行われる「アクティビティ」のテーブルだとしましょう。

テーブルから user_id ごとに 1 つのランダムな行を選択する最も効率的な方法は何ですか?

たとえば、上記のテーブルの場合、select は 5 行を返します。user_id 3に 1 つ、41 つ、8に 1 つ、23に 1 つ、90に 1 つ。

私はこのアプリケーションに PHP を使用しているので、考えていたことの 1 つは、すべてのアクティビティのビット リストをクエリし、PHP でそれらをループして、user_id ごとにランダムに 1 行を抽出することでした。これにより、MySQL サーバーへの SELECT 呼び出しが 1 回だけになります。

あるいは、これは一連のサブ選択で実行できると思いますが、その構文を設定する方法がわかりません。とにかく遅くなるかどうかはわかりません...

4

2 に答える 2

0

mysql が許可する特別な「トリック」があるため、mysql を使用するのは幸運です。

select user_id, activity
from activities
group by user_id;

sqlfiddle でこのクエリを参照してください。

mysql (のみ、afaik) では、グループ化されていない列を集計する必要はありません。これを行うと、mysql は各グループで見つかった (最初の * 行) を返します。

他のすべてのデータベースでは、このクエリが代わりに構文エラーを引き起こすことがわかっています。


さて、このクエリは理論的にはランダムな行を返しますが、SQL 標準では、順序付けされていない場合、行は任意の順序である可能性があるとされていますが、実際には、このクエリは、行の順序を変更しない限り、各ユーザーに対して同じ「ランダムな」行を返します。いくつかの挿入/削除を行うことでディスク。

ユーザーごとに「ランダム - つまり毎回異なる - 行」が本当に必要な場合は、この uqery を使用して、次のようにランダムに並べられた行セットから選択する必要があります。

select user_id, activity
from (select * from activities order by rand()) x
group by user_id;

sqlfiddle でこのクエリを参照してください

于 2012-09-17T18:54:17.493 に答える
0

このクエリを試すことはできません:

select * from (
select activity, user_id from activities order by rand()
) as x group by user_id;

最初のクエリはレコードをランダムに並べ替え、2 番目のクエリは各 user_id の一番上の行のみを返します。

于 2012-09-17T19:10:22.820 に答える