mysql中带有局部变量和随机化的limit union和order by子句的正确语法:错误(1221)

mysql中带有局部变量和随机化的limit union和order by子句的正确语法:错误(1221),mysql,union,where-clause,random-sample,sql-limit,Mysql,Union,Where Clause,Random Sample,Sql Limit,我试图创建一个随机样本(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 #发布本文后,我可以通过这种通用语法获取元素 但是,将这两个条件的并集视为此处的并集时,它不起作用。而且使用“预测”或“预

我试图创建一个随机样本(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
#发布本文后,我可以通过这种通用语法获取元素

但是,将这两个条件的并集视为此处的并集时,它不起作用。而且使用“预测”或“预测”或“预测”的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
我也尝试过类似的方法(我认为这在efficienet中非常有效,因为这将创建临时表(我也可以选择视图,但关键是要正确)

我模模糊糊地理解这是关于移动工会和订单条款 提示:-请解释为什么失败,如果可能的话,不要建议其他方法,比如连接。相关-

看起来我明白了

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,并将其放在组合查询之后(真是太小了!)

# 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 
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