显示最近100个条目中的随机行?

时间:2009-04-20 00:42:28

标签: php mysql

我正在显示所有条目中的随机行,并且工作正常。

SELECT * FROM $db_table where live = 1 order by rand() limit 1

现在,我想将它限制在db中的最后100个条目。

db中的每一行都有一个ID和一个时间戳。

它是一个小型数据库,因此开销最小化不是优先事项。

谢谢!

编辑:

仍然无法让它运行..我得到一个mysql_fetch_array错误:

"Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource

以下是我的所有代码:

<?php $sql = "SELECT * FROM
(SELECT * FROM $db_table ORDER BY $datetime DESC LIMIT 100)
ORDER BY rand() LIMIT 1";
$query = mysql_query($sql);
while($row = mysql_fetch_array($query)) {

echo "".$row['familyname']."";

} ?>

再次感谢!

2 个答案:

答案 0 :(得分:4)

这是我想到的最重要的事情。我已经测试了它,它在SQLite中运行,所以你不应该对MySQL有太多麻烦。唯一的变化是SQLite的随机函数是random()而不是rand():

SELECT * FROM
  (SELECT * FROM $db_table ORDER BY $timestamp DESC LIMIT 100)
ORDER BY rand() LIMIT 1

答案 1 :(得分:1)

This page有关于如何优化ORDER BY RAND()类型查询的详细说明。实际上,对于我来说,在SO上进行充分的解释实际上也是如此(我也不完全理解所使用的一些SQL命令,尽管一般概念是有意义的),但最终的优化查询使用了几个优化:

  1. 首先,删除在整个表上使用ORDER BY RAND()算法的filesort。而是构造一个查询来简单地生成一个随机id。
  2. 在此阶段,正在使用index scan,在许多情况下效率甚至低于filesort,因此使用子查询进行优化。
  3. WHERE子句替换为JOIN,以减少外部SELECT提取的行数,以及子查询执行的次数,仅为1。 / LI>
  4. 为了计算ID中的漏洞(来自删除)并确保相等的分布,创建映射表以将行号映射到ID。
  5. 触发器用于自动更新&amp;维护映射表。
  6. 最后,创建存储过程以允许一次选择多行。 (此处,ORDER BY被重新引入,但仅用于结果行。)
  7. 以下是效果数据:

    • Q1。 ORDER BY RAND()
    • Q2。兰德()* MAX(ID)
    • Q3。 RAND()* MAX(ID)+ ORDER BY ID
       100        1.000      10.000     100.000    1.000.000
    Q1  0:00.718s  0:02.092s  0:18.684s  2:59.081s  58:20.000s
    Q2  0:00.519s  0:00.607s  0:00.614s  0:00.628s   0:00.637s
    Q3  0:00.570s  0:00.607s  0:00.614s  0:00.628s   0:00.637s