微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 从MySQL中选择可变数量的随机记录

我想从数据库显示一条随机记录.如果我选择,我希望能够显示X个随机记录.因此,我需要从随机选择的ID列表中选择前X个记录

(除非地球尺寸急剧增加,否则将不会有超过500条记录可供选择.目前有66种可能.)

这个功能有效,但我怎样才能让它变得更好?

/***************************************************/
/* RandomSite */
//****************/
//  Returns an array of random site IDs or NULL
/***************************************************/   
function RandomSite($intNumberofSites = 1) {
    $arrOutput = NULL;
    //open the database
    GetDatabaseConnection('dev');

    //inefficient
    //$strsql = "SELECT id FROM site_info WHERE major <> 0 ORDER BY RAND() LIMIT ".$intNumberofSites.";";

    //Not wonderfully random
    //$strsql = "SELECT id FROM site_info WHERE major <> 0 AND id >= (SELECT FLOOR( COUNT(*) * RAND()) FROM site_info ) ORDER BY id LIMIT ".$intNumberofSites.";";

    //Manual selection from available pool of candidates  ?? Can I do this better ??
    $strsql = "SELECT id FROM site_info WHERE major <> 0;";

    if (is_numeric($intNumberofSites))
    {
        //excute my query
        $result = @MysqL_query($strsql);
        $i=-1;

        //create an array I can work with  ?? Can I do this better ??
        while ($row = MysqL_fetch_array($result, MysqL_NUM))
        {
            $arrResult[$i++] = $row[0];
        }

        //mix them up
        shuffle($arrResult);

        //take the first X number of results  ?? Can I do this better ??
        for ($i=0;$i<$intNumberofSites;$i++)
        {
            $arrOutput[$i] = $arrResult[$i];
        }
    }   

    return $arrOutput;
    }

更新问题:
我知道ORDER BY RAND(),我只是不想使用它,因为有传言说它不是最好的缩放和性能.我对我的代码过于挑剔.我的作品ORDER BY RAND()有效,但我可以做得更好吗?

更多更新
ID中有漏洞.没有大量的流失,但任何流失都需要得到我们团队的批准,因此可以处理转储任何缓存.

谢谢你的回复

解决方法:

为什么不在数据库查询中使用orderby中的Rand函数?那么你不必在代码中进行随机化等…

像(我不知道这是否合法)

Select *
from site_info
Order by Rand()
LIMIT N

其中N是您想要的记录数…

编辑
您是否已将您的代码查询解决方案进行了分析?我想你只是在这里进行预优化.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐