在MySQL UNION查询中使用ORDER BY RAND()和单独的LIMIT语句

时间:2014-03-29 01:41:57

标签: mysql random union

我想运行这样的查询,这样即使第一个SELECT语句没有足够的数据来返回10个结果,我也总会得到20个结果。

(
SELECT t.column1, t.column2
FROM table t 
WHERE t.status = 1 
LIMIT 10
)
UNION
(
SELECT t.column1, t.column2 
FROM table t
WHERE t.status = 2 
LIMIT 20 
)
LIMIT 20 

但我想要ORDER BY RAND()并确保第一个SELECT语句的所有可用结果都包含在最终结果集中。

当我在此查询的末尾添加ORDER BY RAND()时,它为我提供的结果集不包含第一个SELECT的所有10个结果,我假设因为它实际上得到30行然后从30开始随机选择20。

任何想法都将不胜感激。

这对我有用:

SELECT x.*
FROM ((
SELECT t.column1, t.column2
FROM table t 
WHERE t.status = 1 
LIMIT 10
)
UNION
(
SELECT t.column1, t.column2 
FROM table t
WHERE t.status = 2 
LIMIT 20 
)
LIMIT 20) x
ORDER BY RAND

1 个答案:

答案 0 :(得分:2)

如果您在应用LIMIT 20之前首先按“SELECT”来选择UNION结果,那么该工作是否有效:

SELECT … FROM
(
  (
    SELECT t.column1, t.column2, 0 AS ordervalue FROM … WHERE …
    LIMIT 10
  )
  UNION
  (
    SELECT t.column1, t.column2, 1 FROM … WHERE …
    LIMIT 20 
  )
  ORDER BY ordervalue ASC # this will make the values from your first SELECT come
                          # first, then the ones from the second

  LIMIT 20 # of those ordered values, the first 20 are taken
)
ORDER BY RAND()

我在这里引入了一个静态值ordervalue - 在您的特殊情况下没有必要,因为您选择了status 1或2,因此您可以直接按该值排序。但如果不是这种情况(或者状态值不同),那么“伪”列值就是最佳选择。