mysql 获取每个参数的记录,而不重复这些参数

ukdjmx9f  于 2023-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(119)

有没有可能创建一个查询,最好不使用数百个联合,为我的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个记录,但这些记录不可重复,并且在样本之间是随机的

6kkfgxo0

6kkfgxo01#

这可以如下使用CTE来完成:

with cte1 as (
  select *
  from mytable where value between 9 and 10
  order by RAND() LIMIT 1
),
cte2 as (
  select t.*
  from mytable t
  left join cte1 c1 on c1.id = t.id
  where c1.id is null and t.value between 9 and 11
  order by RAND() LIMIT 1
),
cte3 as (
  select t.*
  from mytable t
  left join cte1 c1 on c1.id = t.id
  left join cte2 c2 on c2.id = t.id
  where c1.id is null and c2.id is null and t.value between 10 and 15
  order by RAND() LIMIT 1
)
select * from cte1 union all
select * from cte2 union all
select * from cte3

第一个cte1用于获得第一随机行。
cte2用于获得第二个随机行,条件是它还没有被cte1使用left join以条件cte1.id is null拾取。
cte3用于获得尚未被cte1cte2选择的第三随机行。
然后我们使用union all。
Demo here

相关问题