【问题标题】:Select random line in SQL database在 SQL 数据库中选择随机行
【发布时间】:2010-05-27 03:12:31
【问题描述】:

我想在我的数据库中随机选择一行。我在一个网站上看到了这个解决方案:

SELECT column FROM table
ORDER BY RAND()
LIMIT 1

此 SQL 查询运行,但有人说我这是一个非性能查询。还有其他解决方案吗?

谢谢

【问题讨论】:

  • 供将来参考:RAND() 仅适用于 mysql。

标签: php sql mysql select random


【解决方案1】:

是的。你必须用

计算行数
SELECT COUNT(*) FROM `table`;

在此之后使用 php 函数 mt_rand() 获取从 1 到 $count 的随机数并通过查询获取:

SELECT `column` FROM `table` LIMIT $rand, 1

【讨论】:

  • 好的,谢谢 :) 另一个问题,无关的发展,我是法国人,我想知道我的英语是否正确,可以理解?
  • 哎呀,出于某种原因,我以为你问的是mysql。你是否? :-S
  • 英文版?不,不是关于 mysql。
  • 那么您在最初的问题中谈到了哪些 dbms? Microsoft SQL Server?
  • 哦,最初的问题,是的,有 MySQL ^^
【解决方案2】:

this question 对此主题进行了更多讨论,包括对不同 DBMS 的性能影响和策略。

【讨论】:

  • 该主题的所有答案都可以分为 2 个类别。 1. slow 使用 RAND()(或 DBMS 特定的同义词)或 2. 计算 [1, id] 范围内的一些随机 id 并找到 >= 的值。该解决方案为我们提供了不规则的随机覆盖(例如:1、2、3、4、5、6、7、8、9、1000000000000。在这种情况下,99.99% 的情况下您将获得最新的行)。这不是真正的均匀随机
  • 我认为这是 TANSTAAFL 的问题。像 TABLESAMPLE 这样的方法显然会以随机性换取速度(并且是特定于供应商的)。如果你想进入寻找真正随机性的兔子洞,你就是在一个实现挑战中添加一个理论数学问题。您可以添加一个触发器,在插入时使用伪随机数填充列,将大表“预切片”为可管理的分片,然后从一个分片中选择一行,rand() limit 1。因此,预先计算一些“假”随机性。我同意所有这些方法都涉及纯度和实用性之间的折衷。
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
  • 2010-10-09
相关资源
最近更新 更多