想象一下,我有一个 MySQL 数据库表,里面有 1000 条记录,我想随机选择 1 条记录。
记录没有数字每次上升 +1 的 ID 列。ID 号是随机生成的,因此第一个记录 ID 可以是“932151540”,第二个记录 ID 可以是“541577961”。
我能想到随机选择 1 条记录的唯一方法是找出总共有多少条记录。选择一个介于 1 和有多少之间的随机数(比如随机数是 467)。然后获得第 467 条记录。
我将如何使用 PHP 做到这一点?
提前致谢 :)
SELECT * FROM table ORDER BY RAND() LIMIT 1;
SELECT *
FROM TABLE
ORDER BY RAND()
LIMIT 1
您可以使用的替代查询是
SELECT * FROM myTable WHERE RAND()<(SELECT ((1/COUNT(*))*10) FROM myTable) ORDER BY RAND() LIMIT 1;
随着表大小的增加,这将产生更好的性能。
引用作者的话:
此方法使用 ORDER BY RAND(),但仅对一小部分表行;此百分比基于您想要的行数 LIMIT 1 除以表的行数 COUNT(*),然后将该数字乘以 10 以避免返回的行数少于您的请求数。在阅读了如何在 MySQL@rndblog.com 中选择随机行之后,我开发了这种方法。
阅读此处的完整帖子以获得详细的解释和性能分析,以及其他可能不适用于您的情况的替代方案。
我使用它而不是慢ORDER BY rand(),相当快。
$table = "mytable";
$offset_result = mysql_query("SELECT FLOOR(RAND() * COUNT(*)) AS offset FROM ".$table.";");
$offset_row = mysql_fetch_object($offset_result);
$offset = $offset_row->offset;
$result = mysql_query("SELECT * FROM ".$table." LIMIT ".$offset.", 1;");
$result_row = mysql_fetch_row($result); // point to record
$row = $result_row[0];