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()问题的主要内容,如果未能解决你的问题,请参考以下文章