SQL在排序后选择顶部Y中的X个随机行

时间:2013-05-08 16:20:27

标签: mysql sql

使用MYSQL,我希望选择

1)按“价格”栏

排序后,前20行中有5个随机行

2)按“价格”栏

排序后,30个下一个结果(第21-50行)中的15个随机行

使用SQL实现此性能的最佳方法是什么?请注意,该表包含大约1,000,000行。

最终目的是为这些随机选择的行更新一列(SET状态= 1)。

2 个答案:

答案 0 :(得分:1)

使用嵌套选择 - 在这种情况下应该非常快

select * from 
(
select .... from table 
order by price
limit X, Y
)
order by random

用适当的值替换X和Y

请注意,根据特定的RDBMS,“随机排序”和“限制”条款可能会有所不同!这是MySQL方式。

最重要的是服务器将首先执行内部选择,这将只返回20-30行(取决于限制子句),您可以在外部选择中以随机顺序对其进行排序。如果将价格列编入索引,这将足够快

答案 1 :(得分:1)

  ( SELECT dt.*
    FROM 
      ( SELECT t.*                    -- columns you need from the table
        FROM tableX AS t              -- your table name in place of "tableX"
        ORDER BY price DESC
          LIMIT 20
          OFFSET 0
      ) AS dt
    ORDER BY RAND()
      LIMIT 5
  )
  UNION ALL 
  (
    SELECT dt.*
    FROM 
      ( SELECT t.* 
        FROM tableX AS t 
        ORDER BY price DESC
          LIMIT 30
          OFFSET 20
      ) AS dt
    ORDER BY RAND()
      LIMIT 15
   ) ;