我想结合两个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
第一个选择的结果始终出现在第二个选择结果之前,每个结果集按随机顺序排列。
我可以将每个查询分开,然后合并结果,但我想知道是否可以在一个查询中完成此操作
答案 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
应用于整个集合,而不仅仅是第二个查询。
答案 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说这些集合是串联的。