Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从具有不同where案例的表中选择多个随机结果的最佳方法是什么_Mysql_Sql_Select_Sql Order By - Fatal编程技术网

Mysql 从具有不同where案例的表中选择多个随机结果的最佳方法是什么

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

我有这个问题,没有什么特别的,但我认为它根本没有效率。我想从一个表中选择具有不同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 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