0

以下のようにランダムサンプル(30-70)を作成しようとしています-:

set @total=(select count(*) from tab_1 where predict_var ="4" or predict_var ="2" ) ;
set @sample= (select @total*(70/30))  ;

#@total,@sample
#4090,9543.333331970

#これを投稿して、この一般的な構文を介して要素を取得できます

PREPARE STMT FROM "SELECT * FROM tab_1 where predict_var ='2' or  predict_var ='4' ORDER BY RAND() LIMIT ? " ;
EXECUTE STMT USING @sample; # **THIS WORKS**

しかし、このように 2 つの条件の和をとっている間は、うまくいきません。そして、'' または "" を使用した predict_var ='2' または predict_var ='4' の where 条件が機能しないようです - どうすれば機能しますか?

私の完全なユースケースは次のようなものです -:

#This logic is my end-goal in retrieval of records
PREPARE STMT FROM " SELECT * FROM tab_1 WHERE predict_var = '4' or predict_var = '2' ORDER BY RAND() union (SELECT * FROM tab_1 WHERE predict_var = '0' or predict_var = '1' ORDER BY RAND() limit ?  )"
EXECUTE STMT USING @sample; # **does not work**

# This does not work either and gives "Error(1221) incorrect usage of union and order by

私もこのようなことを試しました(これは一時テーブルを作成するため、非常に非効率的だと思います(ビューを選択することもできますが、ポイントはそれを正しくすることです)

# using temp table/ could also get it via views - but doesn't work,nevertheless
#Alternate logic - but does not work either

PREPARE STMT FROM "SELECT * FROM tab_1 WHERE predict_var = '0' or predict_var = '1' ORDER BY RAND() limit ? " ; # Works

create table temp
select * from (EXECUTE STMT USING @sample ) ; # Error(1064)

SELECT * FROM tab_1 WHERE predict_var = '4' or predict_var = '2' ORDER BY  RAND() union select * from temp ; # of course does not work 

これはユニオンとオーダーバイ句の移動に関するものだと漠然と理解しています ヒント:-可能であれば、連結などの他の方法を提案せずに、なぜこれが失敗するのかを説明してください。関連 - http://orkus.wordpress.com/2010/06/29/variable-limit-statement-in-mysql/

4

1 に答える 1

0

わかったみたい!

PREPARE STMT FROM " SELECT * FROM tab_1 WHERE predict_var = '4' or predict_var = '2'  union 
(SELECT * FROM tab_1 WHERE predict_var = '0' or predict_var = '1' limit ?  ) ORDER BY RAND() " ;
EXECUTE STMT USING @sample; # fetches a total of 13,633 records

*私が変更した唯一のことは、最初のクエリからorder byを完全に削除し、それを結合されたクエリの後に配置することでした (実際には小さなシャッフルです!)。これが機能しない場合、ランダム化が賢明な場合、またはより良い提案がある場合は、微調整してください.

于 2014-01-20T15:31:40.690 に答える