【问题标题】:Mysql 1 Random Row [duplicate]Mysql 1随机行[重复]
【发布时间】:2011-06-23 18:10:50
【问题描述】:

可能重复:
How to request a random row in SQL?

这是正确的做法吗?

$query = 'SELECT * FROM gameids ORDER BY timestamp RAND LIMIT 1';

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    RAND 是一个函数,它在大表中无效,因为它不使用索引。

    $query = 'SELECT * FROM gameids ORDER BY RAND() LIMIT 1';
    

    一种可能的解决方案是添加名为random 的列,并在每条记录上为其生成随机数,然后当您查询数据库时,按此列排序,您将获得伪随机数,但这次使用索引.

    $query = 'SELECT * FROM gameids ORDER BY timestamp, random LIMIT 1';
    

    编辑: 您还可以通过应用像 RAND() * MAX(numeric_column_name) 这样的表达式使 RAND() 更“灵活”

    如果您对优化感兴趣,请查看这篇博文:http://jan.kneschke.de/projects/mysql/order-by-rand/

    @Marwelln 是正确的。

    【讨论】:

    • 嗯,这是一个非常非常大的数据库,有没有办法获取总行数,然后生成一个随机数进行排序?
    • 是 innnoDB 还是 MyISAM?你的主键是什么类型的?您是否有仅包含数字数据的列?
    【解决方案2】:

    您不需要告诉它要随机化哪一列,但您确实需要在RAND 之后使用(),因为它是一个函数。

    SELECT
      * 
    FROM
      gameids 
    ORDER BY 
      RAND()
    LIMIT 1
    

    【讨论】:

      【解决方案3】:

      不正确。如果你想让它随机化,你不能按列排序(afaik)。

      $query = 'SELECT * FROM gameids ORDER BY RAND() LIMIT 1';
      

      【讨论】:

      • 不适用于rand - rand() 是一个函数。
      • @Piskvor:我重写了我的答案。
      • +1 表示打字速度快了 30 秒!
      猜你喜欢
      • 2013-05-16
      • 2013-04-23
      • 2012-02-05
      • 2017-07-25
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2012-06-24
      相关资源
      最近更新 更多