【问题标题】:correct syntax for limit union and order by clause with local variables and randomization in mysql : Error(1221)mysql中使用局部变量和随机化的limit union和order by子句的正确语法:错误(1221)
【发布时间】:2014-02-09 20:18:16
【问题描述】:

我正在尝试创建如下随机样本 (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**

但是,当将两个条件的并集作为此处时,它不起作用。它看起来像 where 条件与 predict_var ='2' 或 predict_var ='4' 或与 ''或使用 "" 不起作用 - 我该如何使它起作用?

我的完整用例是这样的 -:

#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 

我隐约明白这是关于移动 union & order by 子句 提示:- 请解释为什么会失败,如果可能的话,不要建议其他方法,比如连接。相关 - http://orkus.wordpress.com/2010/06/29/variable-limit-statement-in-mysql/

【问题讨论】:

    标签: mysql union where-clause random-sample sql-limit


    【解决方案1】:

    看来我明白了!

    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-05-08
      • 2017-01-15
      • 2011-04-01
      • 1970-01-01
      • 2011-09-06
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多