【问题标题】:Most efficient way of randomly selecting any mysql value given multiple values to match it to在给定多个值的情况下随机选择任何 mysql 值以匹配它的最有效方法
【发布时间】:2014-01-24 15:57:14
【问题描述】:

好的,所以我有一个值列表,我想要它,以便用户可以选择任何 7 个不同的选项,它会从带有任何这些选项的表中随机选择 x 个值。

结构类似于
ImgID(唯一键)|站点ID |其他表

尝试 1: 我尝试的第一种方法是读取数据库中的任何选定值,并计算每个选定选项的数量。出现的数量存储在一个变量中(只需将其称为 num),并且也计算了总量。然后它选择一个介于 1 和最大数量之间的随机数,遍历 num 变量和各个数量,将其递增直到超过该值,从而显示随机值落在哪个选项值上。这可以正确随机选择选项,但仍然需要从数据库中进行另一个随机选择,这会导致下一次尝试。

尝试 2: 来自数据库的随机值似乎是合理的,但我想为什么不一次全部完成并跳过很多查询。我似乎无法让它正常工作,我正在使用这个网站 - http://akinas.com/pages/en/blog/mysql_random_row/ 并选择了底部方法来使用。这里有很多错误消息 - “无法保存结果集”、“执行被中断”、“与 mysql 服务器的连接丢失”和“不是有效的结果资源”

代码是

for($i=0;$i<count($sites)-1;$i++){
    $siteinfo = explode("@",$sites[$i]);
    $siteid = $siteinfo[0];
    $sitegroup = $siteinfo[1];
    if($i!=0){
        $sqlextra .= " OR ";
    }
    $sqlextra .= "SiteID='".$siteid."'";
}
$sql="SELECT * FROM ImageList WHERE ImgID >= (SELECT FLOOR( MAX(ImgID) * RAND()) FROM 
ImageList) AND Valid='1' AND (".$sqlextra.") ORDER BY ImgID LIMIT 1";
if(mysql_query($sql, $mysql_connect)){}
else{echo mysql_error();}

并且选择了几个选项的sql输出是

SELECT * FROM ImageList WHERE ImgID >= (SELECT FLOOR( MAX(ImgID) * RAND()) FROM ImageList) AND Valid='1' AND (SiteID='6' OR SiteID='7') ORDER BY ImgID LIMIT 1

我不太擅长 mysql,所以不确定我是否在某个地方出错了,但是如果有人有更好的方法来做到这一点,或者只是知道为什么我的不工作,我将不胜感激,干杯

【问题讨论】:

    标签: php mysql


    【解决方案1】:
    select * from ImageList where Valid='1' AND (SiteID='6' OR SiteID='7') order by RAND() Limit 1
    

    这应该更有效率:)

    【讨论】:

    • ORDER BY RAND() 永远不应该被认为是有效的 - 它确实不是,例如阅读 OP 中链接到的文章:akinas.com/pages/en/blog/mysql_random_row
    • 啊,谢谢伙计,工作得很好:) 编辑:哦,它似乎在大约 1 秒内工作,但是有 9000 个值,所以这有点慢还是好吗?
    猜你喜欢
    • 2016-02-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2012-04-08
    • 2016-09-07
    • 2013-10-27
    • 1970-01-01
    • 2017-06-30
    相关资源
    最近更新 更多