【问题标题】:Multiple rows alternative for RAND() [duplicate]RAND()的多行替代[重复]
【发布时间】:2013-05-31 08:22:54
【问题描述】:

我的查询从 50k 行的数据库中选择 100 个随机行时遇到问题。

一开始我只使用了函数 RAND() 但这变得太慢了。

现在我正在使用这个查询:

$query = mysql_query("SELECT t1.* FROM users AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM users WHERE picture != '' && age <= 50 && age >= 18 && username != '')) AS id) AS t2 WHERE picture != '' && age <= 50 && age >= 18 && username != '' && t1.id >= t2.id LIMIT 100");
while($q = mysql_fetch_assoc($query)) 
{ echo $q['id'].'<br>'; }

但有时它会给出一堆空行。

谁能告诉我怎么回事?

谢谢!

更新我也在尝试这个查询,但它给了我一个错误。

$query = mysql_query("SELECT id FLOOR(1 + RAND() * x.m_id) 'rand_ind' FROM users (SELECT MAX(t.id) - 1 'm_id' FROM users t) x WHERE picture != '' && age <= 50 && age >= 18 && username != '' ORDER BY rand_ind LIMIT 100");

mysql_fetch_assoc():提供的参数不是有效的 MySQL 结果资源

【问题讨论】:

  • 以任意顺序获取所有行,然后在 PHP 中对其进行洗牌(或从结果数组中随机抽取一些)可能是正确的方法。
  • @MadaraUchiha,当我们实际上只需要 100 行时选择 50k 行并不是一个好主意
  • @v2p:没读好,我的错,你是对的。

标签: php mysql random


【解决方案1】:

使用 RAND() 随机化顺序,然后选择限制 0,100

order by rand() limit 0,100

在mysql中最快的方法

您可能想阅读本文以了解替代方案http://jan.kneschke.de/projects/mysql/order-by-rand/ 不过,按照那篇文章中建议的方式进行操作有一些限制

【讨论】:

    【解决方案2】:

    如果你在表中的 id 是连续的,为什么不直接生成 x 个介于 0 和 "max_rows" 之间的随机数。

    然后做类似的事情

    'SELECT ... FROM .... WHEREidin (' . implode(',', $randomNumbers) . ')';

    它将返回具有生成 id 的行。

    【讨论】:

      【解决方案3】:

      你可以使用:

      SELECT ... FROM ... LIMIT $rand,100
      

      $rand 是代码端随机生成的数字 (0-50k)

      【讨论】:

      • 不幸的是,只有第一项是随机的,其余的充其量是准随机的。
      • 是的,100行的组是随机的,不是每一行
      • 无论如何,如果限制为 2000,100,那么并非所有接下来的 100 个用户都有我在 "WHERE picture != '' &amp;&amp; age &lt;= 50 &amp;&amp; age &gt;= 18 &amp;&amp; username != ''" 中使用的过滤器
      • LIMIT 应用在过滤之后而不是之前
      猜你喜欢
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2010-12-21
      • 2012-08-13
      • 2013-03-02
      • 2015-05-30
      • 1970-01-01
      相关资源
      最近更新 更多