有没有可能创建一个查询,最好不使用数百个联合,为我的where中的每个项目远程地带来一个记录?
例如,假设我有下表
| id|价值|
| - -----|- -----|
| 1|十个|
| 2|九个|
| 3|十一|
| 4|十五|
| 5个|十四|
| 六|二十个|
| 七个|二十一|
我想得到一个值在9到10之间的随机记录,在同一个查询中,我还想得到一个值在9到11之间的随机值,然后再得到一个值在10到15之间的随机值
在这种情况下,仅仅启动是不够的:
SELECT ... WHERE (value >= 9 AND value <= 10) OR (value >= 9 AND value <= 11) OR (value >= 10 AND value <= 15)
ORDER BY RAND()
LIMIT 3
因为接收到的值 将来自id 1, 2 3
,但不满足(value >= 10 AND value <= 15)
的条件。
使用联合是可能的,但是如何确保在每个子查询中不重复值呢 已经从其他子查询中得到了吗
例如:
SELECT * FROM (
SELECT ... WHERE value >= 9 AND value <= 10 ORDER BY RAND() LIMIT 1
UNION ALL
SELECT ... WHERE value >= 9 AND value <= 11 ORDER BY RAND() LIMIT 1
UNION ALL
SELECT ... WHERE value value >= 10 AND value <= 15 ORDER BY RAND() LIMIT 1
) tb
在这种情况下,它将重复id 1
两次,并且可以带来任何一个id (1, 3, 5 and 4)
但我真正想要的是满足每个条件的3个记录,但这些记录不可重复,并且在样本之间是随机的
1条答案
按热度按时间6kkfgxo01#
这可以如下使用CTE来完成:
第一个
cte1
用于获得第一随机行。cte2
用于获得第二个随机行,条件是它还没有被cte1使用left join
以条件cte1.id is null
拾取。cte3
用于获得尚未被cte1
和cte2
选择的第三随机行。然后我们使用union all。
Demo here