我想运行这样的查询,这样即使第一个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
答案 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,因此您可以直接按该值排序。但如果不是这种情况(或者状态值不同),那么“伪”列值就是最佳选择。