Mysql 从具有不同where案例的表中选择多个随机结果的最佳方法是什么
我有这个问题,没有什么特别的,但我认为它根本没有效率。我想从一个表中选择具有不同where大小写的随机行。因此,结果应该是1个随机行,每个select都有特定的类型,如查询中所示。某些类型值可以相同,但仍应返回随机结果Mysql 从具有不同where案例的表中选择多个随机结果的最佳方法是什么,mysql,sql,select,sql-order-by,Mysql,Sql,Select,Sql Order By,我有这个问题,没有什么特别的,但我认为它根本没有效率。我想从一个表中选择具有不同where大小写的随机行。因此,结果应该是1个随机行,每个select都有特定的类型,如查询中所示。某些类型值可以相同,但仍应返回随机结果 Select * from fruits where type = 1 order by RAND() limit 1 Select * from fruits where type = 1 order by RAND() limit 1 Select * from fruits
Select * from fruits where type = 1 order by RAND() limit 1
Select * from fruits where type = 1 order by RAND() limit 1
Select * from fruits where type = 3 order by RAND() limit 1
Select * from fruits where type = 4 order by RAND() limit 1
Select * from fruits where type = 4 order by RAND() limit 1
如果您正在使用Postgres:
您可以使用带有ORDER BY RAND的ROW_NUMBER窗口函数为每种类型的行指定随机顺序。
然后为每种类型选择所需的行数。
这将在MySql中工作:
SELECT *
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY type ORDER BY RAND()) rn
FROM fruits
WHERE type IN (1, 3, 4)
) t
WHERE rn <= CASE type
WHEN 1 THEN 2 -- 2 rows for type = 1
WHEN 3 THEN 1 -- 1 row for type = 3
WHEN 4 THEN 2 -- 2 rows for type = 4
END
请参阅简化的。我将其表示为:
select t.*
from (select t.*,
row_number() over (partition by type order by rand()) as seqnum
from t
) t join
(select 1 as type, 2 as n union all
select 3 as type, 1 as n union all
select 4 as type, 2 as n
) x
using (type)
where x.n <= seqnum
您使用的是哪种dbms?mysql,但只要我知道如何操作就行了,即使不是mysql示例。您需要简单地合并查询吗?不合并,我只是不认为每次执行5个查询都有效,所以我只想将其转换为1个查询。需要检查如何转换为mysql,但是,如果我想返回类似于1,1,2,3,3,5的内容,那么这个问题会起作用吗。有些结果可能具有相同的类型,但仍然应该随机选取?它不会对它们进行分组,对吗?不,这是每种类型显示一个随机行。我目前正在使用mysql,但计划无论如何迁移到sql,因此将设置一个测试服务器并在明天进行测试,谢谢。@V.Rashkov For sql server唯一的区别是将RAND更改为NEWID:
select t.*
from (select t.*,
row_number() over (partition by type order by rand()) as seqnum
from t
) t join
(select 1 as type, 2 as n union all
select 3 as type, 1 as n union all
select 4 as type, 2 as n
) x
using (type)
where x.n <= seqnum