1

如何从 SQL 数据库查询中随机选择一行?我的意思是:

从表 1 中选择所有类别为“绿色”的事物:

$stmt = $db->query('SELECT * from table1 WHERE Category LIKE "%green%"');

然后从这个选择中随机显示一行(而不是像我在下面所做的那样显示这个选择中的每一行)

while($rows = $stmt->fetch()){
     echo "<tr><td>". $rows['Number'] . "</td><td>" . $rows['Content'] . "</td></tr>";
};
4

4 回答 4

5

在大小合理的数据集中,随机排列行并选择第一个:

...ORDER BY RAND() LIMIT 1;

您的声明将变为:

$stmt = $db->query(
    'SELECT * from table1
     WHERE Category LIKE "%green%"
     ORDER BY RAND() LIMIT 1;'
);

如果您在查询中缩小选择范围,则无需使用杂乱的过程从 PHP 代码的结果集中提取单行。

如果您的数据集非常大,请考虑按照 Tobias Hagenbeek 的建议执行多个查询:

  1. COUNT()匹配的行。
  2. 在 PHP 中,选择一个介于 1 和COUNT().
  3. 执行新查询以选择指定行:

    ...LIMIT <random number>, 1;

最后,如果您只需要一个任意行并且随机性/唯一性不是问题,请考虑按照 Gordon Linoff 的建议每次从表中选择第一行:

...LIMIT 1;
于 2013-05-16T19:47:48.297 回答
0

简单的方法是这样的:

$stmt = $db->query('SELECT * from table1 WHERE Category LIKE "%green%" ORDER BY RAND()');

ORDER BY RAND()将对结果进行随机排序,但作为操作(链接)有点昂贵。

如果您关心这类事情,您也可以查询表中的行数,然后执行$r = rand(0, $count-1),然后LIMIT 1 OFFSET $r在查询结束时执行。

于 2013-05-16T19:51:34.603 回答
0

你可以使用 ORDER BY RAND(),但你应该厌倦这样做。特别是如果您正在谈论大型系统,并且超过 10k 行。

这就是为什么...

当你运行这样的查询时会发生什么?假设您在一个有 10000 行的表上运行此查询,然后 SQL 服务器生成 10000 个随机数,扫描这些数字以查找最小的数字并为您提供这一行。生成随机数是相对昂贵的操作,扫描它们以找到最小的数字(如果你有 LIMIT 10,它将需要找到 10 个最小的数字)也不是那么快(如果报价是文本它会更慢,如果它是固定大小的东西更快,可能是因为需要创建临时表)。

所以你应该做的是对你的行进行计数,在 0 和你的 count-1 之间取一个随机数,然后执行 SELECT column FROM table LIMIT $generated_number, 1

于 2013-05-16T20:02:32.093 回答
0

如果您只想要所有行集中的一行,那么最快的方法就是:

 SELECT *
 from table1
 WHERE Category LIKE "%green%"
 LIMIT 1;

这将为您提供数据中遇到的第一行。近似地,这是插入到表中符合您的条件的第一行。(这不是保证。例如,删除肯定会改变这一点。)

这具有快速的优点,这很有用,因为索引不会使您在where子句中受益。在这种情况下,查询会执行全表扫描,但会在第一次匹配时停止。

真正随机行的替代方法是使用rand()

SELECT *
from table1
WHERE Category LIKE "%green%"
order by rand()
limit 1;

这需要不停止的全表扫描,因为排序需要所有匹配项。然后,您需要通过 rand() 对子集进行排序的额外开销。如果性能确实是一个问题,还有一些替代方案。

于 2013-05-16T20:08:19.243 回答