0

指定されたパラメータに基づいて、ランダムな数のエントリを選択しようとしています。

テーブルTがある場合のように

T( id, data1, data2 ,no);

no は、ランダムな数字の集まりを持つフィールドです。

no の数が特定の値になるように、T のランダムなサブセットを取得したいと考えています。

たとえば、total no=7 が必要だとしましょう

T(0,a,a,4);
T(1,B,B,4);
T(2,v,v,1);
T(3,d,d,2);
T(4,d,d,3);

クエリへのクエリの出力は次のいずれかになります

T(0,a,a,4);
T(4,d,d,3);

また

T(1,B,B,4);
T(2,v,v,1);
T(3,d,d,2);

これは可能ですか?ロジックが思いつきませんでした。私が考えることができる最善の方法は、一度に1行ずつ取得し、数え続けることでしたが、それは非効率的です。

(注: カウントが no を超える場合は許容されますが、その逆ではありません)

4

1 に答える 1

1

これでかなり近づきます。

create table t ( name varchar(1), num tinyint ) ;

insert into t (name, num) values ( 'a', 4 ), ('b', 2), ('c', 3),
    ('d',1), ('e', 4), ('f', 1),('g', 6);

クエリは次のとおりです。

select * from 
  (select name, num, @cum := @cum + num as cumulate from 
    (select * from t order by rand()) as t3, 
  (select @cum := 0 ) as t1 
  ) as t2
where cumulate <= 7;

ここにフィドルがあります。最適化できると確信していますが、作成方法に興味がありました。

于 2013-11-16T17:56:14.363 に答える