php order by rand()问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php order by rand()问题相关的知识,希望对你有一定的参考价值。

function _chu2($begin,$limit,$rand)
$sql="select * from $this->table order by rand($rand) limit $begin,$limit";
echo $sql;
$query=mysql_query($sql);
$array=array();
for ($i=0;$i<mysql_num_rows($query);$i++)
$row=mysql_fetch_array($query);
$array[$i]=$row;

return $array;

这是我的方法
我想从数据库里随机抽出十条信息 分页一页显示一条
我现在下一页一直可以按下去 怎么解决啊
总页数是10 我在页面判断了如果page=总页数就不显示下一页的链接
但是无效··
这是我打印出来的数据库语句
select * from question order by rand(10) limit 0,1

参考技术A order by rand(10) 有问题 参考技术B 程序逻辑问题 好好检查下程序逻辑 参考技术C php order by rand()问题
悬赏分:20 | 离问题结束还有 7 天 21 小时 | 提问者:风干后的伤口
function _chu2($begin,$limit,$rand)
$sql="select * from $this->table order by rand($rand) limit $begin,$limit";
echo $sql;
$query=mysql_query($sql);
$array=array();
for ($i=0;$i<mysql_num_rows($query);$i++)
$row=mysql_fetch_array($query);
$array[$i]=$row;

return $array;

这是我的方法
我想从数据库里随机抽出十条信息 分页一页显示一条
我现在下一页一直可以按下去 怎么解决啊
总页数是10 我在页面判断了如果page=总页数就不显示下一页的链接
但是无效··
这是我打印出来的数据库语句
select * from question order by rand(10) limit 0,1

推荐答案

程序逻辑问题 好好检查下程序逻辑

ORDER BY RAND()函数在mysql中执行需要很长时间[重复]

【中文标题】ORDER BY RAND()函数在mysql中执行需要很长时间[重复]【英文标题】:ORDER BY RAND() function taking long time to execute in mysql [duplicate] 【发布时间】:2014-12-06 11:17:20 【问题描述】:

我必须在MYSQL query 中使用 RAND 函数。如果我在 sql 查询中使用这个函数,那么这大约需要 0.7962 秒。但是,如果我不使用它,那么它可以在 0.0009 秒内正常工作。如何使用 RAND 函数使 sql 查询更快。

我的查询

  SELECT 
         posts.ID,
         posts.post_content, 
         posts.post_title, 
         posts.post_date, 
         posts.post_name 
    FROM posts 
         WHERE posts.post_type = 'post' 
         AND posts.post_status = 'publish' 
    ORDER BY RAND() LIMIT 0, 24 

【问题讨论】:

看这篇文章explainextended.com/2009/03/01/selecting-random-rows 您是否在“冷”服务器上为没有ORDER BY 的查询计时? 0.0009 秒听起来像是从缓存中获取结果。 【参考方案1】:

rand() 有一些性能“问题” - 这里讨论了一些建议:How can i optimize MySQL's ORDER BY RAND() function?

【讨论】:

【参考方案2】:

这非常慢,因为您要为表中的每一行分配一个随机值,然后对整个表进行排序,然后将大部分丢弃。你会过得更好:

    检索所有帖子 ID; 在php中随机选择其中的25个; 在数据库中查询这些行。

这将在线性时间内运行;目前是O(n log n)

这是迄今为止我见过的允许不均匀分布 ID 的最佳解决方案。如果您的 ID 是连续的(换句话说,如果您永远不会删除任何行),您可以更快地完成此操作。

【讨论】:

【参考方案3】:

我去解决。

 SELECT p1.ID, p1.post_content, p1.post_title, p1.post_date, p1.post_name
     FROM posts as p1 JOIN
          (SELECT CEIL(RAND() *
                 (SELECT MAX(ID)
                    FROM posts)) AS id)
          AS p2
  WHERE p1.ID >= p2.id
  ORDER BY p1.ID ASC
  LIMIT 0, 24

这比我的查询要快。

MySQL select 10 random rows from 600K rows fast

这是解决方案。

谢谢

【讨论】:

【参考方案4】:

查看此链接: http://jan.kneschke.de/projects/mysql/order-by-rand/

对于大多数一般情况,您可以这样做:

SELECT name
  FROM random AS r1 JOIN
       (SELECT CEIL(RAND() *
                     (SELECT MAX(id)
                        FROM random)) AS id)
        AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 1

这假设 id 的分布是相等的,并且 id 列表中可能存在间隙。有关更多高级示例,请参阅文章

【讨论】:

以上是关于php order by rand()问题的主要内容,如果未能解决你的问题,请参考以下文章

ORDER BY RAND() 总是在 IE 上给出相同的行

改进MySQL Order By Rand()的低效率

mysql order by rand() 性能问题及解决方案

ORDER BY RAND() 似乎不是随机的

MySQL ORDER BY rand(),名称为 ASC

MySQL 查询优化与 group by 和 order by rand