0

想象一下,我有一个 MySQL 数据库表,里面有 1000 条记录,我想随机选择 1 条记录。

记录没有数字每次上升 +1 的 ID 列。ID 号是随机生成的,因此第一个记录 ID 可以是“932151540”,第二个记录 ID 可以是“541577961”。

我能想到随机选择 1 条记录的唯一方法是找出总共有多少条记录。选择一个介于 1 和有多少之间的随机数(比如随机数是 467)。然后获得第 467 条记录。

我将如何使用 PHP 做到这一点?

提前致谢 :)

4

4 回答 4

8
SELECT * FROM table ORDER BY RAND() LIMIT 1;
于 2012-05-22T22:21:41.840 回答
6
SELECT *
FROM TABLE
ORDER BY RAND()
LIMIT 1
于 2012-05-22T22:21:45.897 回答
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 中选择随机行之后,我开发了这种方法。

阅读此处的完整帖子以获得详细的解释和性能分析,以及其他可能不适用于您的情况的替代方案。

于 2012-05-22T22:34:51.477 回答
0

我使用它而不是慢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];
于 2012-05-22T22:56:19.090 回答