我正在显示所有条目中的随机行,并且工作正常。
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']."";
} ?>
再次感谢!
答案 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命令,尽管一般概念是有意义的),但最终的优化查询使用了几个优化:
ORDER BY RAND()
算法的filesort
。而是构造一个查询来简单地生成一个随机id。index scan
,在许多情况下效率甚至低于filesort
,因此使用子查询进行优化。WHERE
子句替换为JOIN
,以减少外部SELECT
提取的行数,以及子查询执行的次数,仅为1。 / LI>
ORDER BY
被重新引入,但仅用于结果行。)以下是效果数据:
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