在做Union时如何使用Rand()的ORDER

时间:2015-10-22 02:44:51

标签: mysql sql

我想结合两个select语句的结果,每个结果应该使用ORDER BY RAND()以随机顺序返回,我尝试过类似的东西:

query = "
Select user.id FROM user WHERE user.age > 18 ORDER BY RAND()

UNION 

SELECT user.id FROM user WHERE user.age < 13 ORDER BY RAND()

"   

理想的输出是(给定每个选择只返回3行):

example1:21,31,50 12,11,10

例2:31,50,21,10,12,11

第一个选择的结果始终出现在第二个选择结果之前,每个结果集按随机顺序排列。

我可以将每个查询分开,然后合并结果,但我想知道是否可以在一个查询中完成此操作

6 个答案:

答案 0 :(得分:2)

不要使用union。只需使用两个键order by

Select u.id
FROM user u
ORDER BY (u.age > 18) DESC, RAND();

答案 1 :(得分:1)

MySQL UNION文档[0]表明您可以将ORDER BY子句应用于整个结果集:

query = "
(Select user.id FROM user WHERE user.age > 18)

UNION 

(SELECT user.id FROM user WHERE user.age < 13)

ORDER BY RAND()

"

关键是将每个SELECT包装在括号中,以便ORDER BY应用于整个集合,而不仅仅是第二个查询。

[0] https://dev.mysql.com/doc/refman/5.0/en/union.html

答案 2 :(得分:0)

按NEWID订购()

这将创建一个带有随机ID的临时表,并将显示相同的内容。

答案 3 :(得分:0)

我发现我可以使用伪列来完成这个

query = "
SELECT DISTINCT id
from(
Select user.id, 1 as role  FROM user WHERE user.age > 18 

UNION 

SELECT user.id, 2 as role  FROM user WHERE user.age < 13 
)a
order by role ASC, RAND()
"    

答案 4 :(得分:0)

无需使用UNION,因为两个查询都使用相同的表。

SELECT user.id FROM user WHERE user.age&lt; 13 OR user.age&gt; 18 ORDER BY RAND()

答案 5 :(得分:0)

如果仍然需要将ORDER BY RAND()与UNION结合使用,则可以执行以下操作:

SELECT * FROM (SELECT user.id FROM user WHERE user.age > 18 ORDER BY RAND()) a
UNION 
SELECT * FROM (SELECT user.id FROM user WHERE user.age < 13 ORDER BY RAND()) b

对于TS而言,这需要进行修改,因为对于mySQL:

  

但是,对单个SELECT语句使用ORDER BY意味着   行在最终结果中出现的顺序无关紧要   因为默认情况下UNION会生成无序的行集。

T-SQL说这些集合是串联的。

相关问题