1

我正在寻找一种更好的方法来做到这一点:

SELECT * FROM $tbl_name WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM $tbl_name ) ORDER BY id LIMIT 1;

它很慢而且不是很随机,每 10 个左右的查询我都会得到相同的结果。

这会从表中选择一个随机行,而不考虑其 ID。

到目前为止,我有这个:

// Get amount of rows in database
$result = mysql_query("SELECT * FROM $tbl_name");
$num_rows = mysql_num_rows($result);

// Generate random number
$random_row = rand(1, $num_rows);

但我不知道如何获得某一行。

我不是那意思

SELECT * FROM $tbl_name WHERE id = $random_row

因为我的数据库在 ID 列中有间隙,所以它有时会失败。

有没有人有脚本可以从 MySQL 数据库中获取随机结果而无需回复 ID 并且速度非常快?(数据库包含大约 20000 行)

4

3 回答 3

4
SELECT * FROM $tbl_name WHERE 1 ORDER BY RAND() LIMIT 1;

20,000 行其实不算多,上面的应该够快了。

于 2012-04-21T20:22:36.627 回答
1

Juhana 说得对:“ORDER BY RAND() LIMIT 1”,当然 20k 并没有那么多。其他选项将与子选择一起使用:SELECT [fields] FROM myTable, (SELECT FLOOR(MAX(myTable.id) * RAND()) AS randId FROM myTable) AS someRandId WHERE myTable.id = someRandId.randId

此处讨论 (请避免选择 * 不必要时)

于 2012-04-21T20:33:27.713 回答
0

经过对阿迪发送的链接的评论进行一些搜索后,我找到了一个不错的解决方案。

SELECT * FROM $tbl_name T JOIN (SELECT CEIL(MAX(ID)*RAND()) AS ID FROM $tbl_name) AS x ON T.ID >= x.ID LIMIT 1; 

来源:wanderr.com/jay/order-by-slow/2008/01/30

似乎非常快而且非常随机!

于 2012-04-28T13:36:47.943 回答