【问题标题】:Return a random row without using ID, MySQL返回随机行而不使用ID,MySQL
【发布时间】:2012-04-21 20:20:34
【问题描述】:

我正在寻找更好的方法:

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 行)

【问题讨论】:

  • 补充一下,这个是在高流量网站上使用的,所以速度很重要。
  • 在搜索了 Adi 发送的链接上的 cmets 后,我找到了一个不错的解决方案。 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 好像非常快,非常随机!
  • // Get amount of rows in database - 事实上,您选择的不是数量,而是使用此查询的所有行。去图

标签: php mysql database random


【解决方案1】:
SELECT * FROM $tbl_name WHERE 1 ORDER BY RAND() LIMIT 1;

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

【讨论】:

  • 我已经尝试过您的查询并且它有效,但似乎不是很随机,我每 10 次左右的查询都会得到相同的结果。
【解决方案2】:

Juhana 说得对:“ORDER BY RAND() LIMIT 1”,当然 20k 并没有那么多。 其他选项将带有子选择: 选择 [字段] 从我的表, (SELECT FLOOR(MAX(myTable.id) * RAND()) AS randId FROM myTable) AS someRandId WHERE myTable.id = someRandId.randId

讨论here (请避免在不必要时选择*)

【讨论】:

    【解决方案3】:

    通过 Adi 发送的链接上的 cmets 进行了一些搜索,我找到了一个不错的解决方案。

    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

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

    【讨论】:

    • 所以,它比按 rand() 排序更随机?
    • 是的,当使用 rand() 时,它返回接近 0 的结果的频率更高,而且我每 10 次左右的查询都会收到相同的结果。
    • 它使用相同的 rand() 函数。看来你搞错了
    猜你喜欢
    • 2011-03-24
    • 2015-07-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多