【问题标题】:Select random row that exists in MySQL [duplicate]选择MySQL中存在的随机行[重复]
【发布时间】:2012-06-24 17:23:25
【问题描述】:

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

目前使用:

$randomQuery = mysql_fetch_row(mysql_query("SELECT * FROM `table` WHERE `id` >= RAND() * (SELECT MAX(`id`) FROM `table`) LIMIT 1"));

表结构:

id:
 2 
 4
 5

我想确保它选择的是现有行。例如,它不应该在其随机化函数中使用 1 或 3。有没有办法在 MySQL 中做到这一点?

【问题讨论】:

  • 这取决于漏洞,但我不明白这如何选择不存在的行。
  • 任何使用RAND() 的解决方案都会很慢,因为它不能做索引。如需更快、正确索引的解决方案,请在此处查看我的答案:stackoverflow.com/questions/10677767/…

标签: mysql


【解决方案1】:

您的初始查询确实处理了这些漏洞,因为它只是将行的 id 与您计算的随机值进行比较,并且不会尝试获取具有随机 id 的行。

它的问题是它给你一个不均匀的概率:一个大洞后面的任何一行都有更大的被选中的概率。

这就是为什么建议使用mysql技巧ORDER BY RAND()(参见其他答案)的原因,因为随机化将是准统一的。

【讨论】:

    【解决方案2】:
    SELECT * FROM `table` ORDER BY RAND() LIMIT 0,1;
    

    http://akinas.com/pages/en/blog/mysql_random_row/

    【讨论】:

      【解决方案3】:

      我认为

      SELECT * FROM table ORDER BY RAND() LIMIT 1
      

      会成功的。

      见:

      http://dev.mysql.com/doc/refman/5.0/en/mathematical-functions.html#function_rand

      【讨论】:

      • 这是否考虑到已删除的行?
      • 删除的行 - 我认为 - 从存储引擎中删除,因此它们不会包含在结果中。如果您在该行中只有一个已删除标志而不是 DELETEing 该行完全您需要在您的语句中添加一个 WHERE deleted=0
      【解决方案4】:
      SELECT * FROM table ORDER BY RAND() LIMIT 1
      

      【讨论】:

      • 这会起作用,但会很慢,因为它不会使用索引。
      猜你喜欢
      • 2012-02-05
      • 2013-04-23
      • 2010-11-19
      • 1970-01-01
      • 2013-04-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 2021-04-12
      相关资源
      最近更新 更多