Php SQL如果随机结果的值小于X,则返回更多随机结果,直到达到X值为止?

Php SQL如果随机结果的值小于X,则返回更多随机结果,直到达到X值为止?,php,mysql,sql,random,Php,Mysql,Sql,Random,我有一个表(MySql),其中一列是介于-3和3之间的“值”。 我想做的是: 如果“Value”是正数,则从表中随机抽取一行(在我的例子中,从1到3,负值将用于其他值,在这里不相关) 如果“值”为3,则仅显示该行 如果“值”为2,则显示该行以及另一个“值”为1的随机行 如果“值”为1,则显示该行,再加上一行“值”为2的行,或两行“值”为1的行 或者,换一种方式说,我需要列出行,直到它们的总值为3—由一行值为3、两行值为1和2(或2和1)或三行值为1来完成 以下是我所拥有的: $query = "

我有一个表(MySql),其中一列是介于-3和3之间的“值”。 我想做的是:

  • 如果“Value”是正数,则从表中随机抽取一行(在我的例子中,从1到3,负值将用于其他值,在这里不相关)
  • 如果“值”为3,则仅显示该行
  • 如果“值”为2,则显示该行以及另一个“值”为1的随机行
  • 如果“值”为1,则显示该行,再加上一行“值”为2的行,或两行“值”为1的行
  • 或者,换一种方式说,我需要列出行,直到它们的总值为3—由一行值为3、两行值为1和2(或2和1)或三行值为1来完成

    以下是我所拥有的:

    $query = "SELECT * FROM $usertable WHERE Value>0 ORDER BY RAND() LIMIT 1"; //from all positive Values, get one at random
    $query2 = "SELECT * FROM $usertable WHERE Value BETWEEN 1 AND 2 ORDER BY RAND() LIMIT 1"; //from all Values between 1 and 2, get one at random
    $query3 = "SELECT * FROM $usertable WHERE Value=1 ORDER BY RAND() LIMIT 1"; //from all Values equal to 1, get one at random
    $result = mysql_query($query);
    $result2 = mysql_query($query2);
    $result3 = mysql_query($query3);
    
    while($row = mysql_fetch_array($result)) 
        {
      echo $row['A'] . " " . $row['B'] . " " . $row['C'] . " " . $row['Value'];
      echo "<br>";
        }
    while($row['Value']<3) 
        {
       while($row2 = mysql_fetch_array($result2)) 
            {
        echo $row2['A'] . " " . $row2['B'] . " " . $row2['C'] . " " . $row2['Value'];
        echo "<br>";
            }
        }
    while($row['Value'] + $row2['Value']<3)
        {
        while($row3 = mysql_fetch_array($result3)) 
            {
            echo $row3['A'] . " " . $row3['B'] . " " . $row3['C'] . " " . $row3['Value'];
            echo "<br>";
            }
        }
    
    $query=“从$usertable中选择*,其中值>0按兰德排序()限制1”//从所有正值中,随机取一个
    $query2=“从$usertable中选择*,其中值介于1和2之间,按兰德排序()限制1”//从1和2之间的所有值中,随机获得一个
    $query3=“从$usertable中选择*,其中值=1按兰德排序()限制1”//从所有等于1的值中,随机获得一个
    $result=mysql\u query($query);
    $result2=mysql\u查询($query2);
    $result3=mysql\u查询($query3);
    while($row=mysql\u fetch\u数组($result))
    {
    回显$row['A'].“”.$row['B'].“”.$row['C'].“”.$row['Value'];
    回声“
    ”; } while($row['Value']您的
    while($row['Value']<3)
    循环将永远不会结束,因为您永远不会更改
    $row

    我建议这样做:

    $first = mysql_fetch_assoc(mysql_query("select * from `".$usertable."` where `Value`>0 order by rand() limit 1"));
    $result = array($first);
    switch($first['Value']) {
    case 1:
        $val = rand(1,2);
        $rows = 3-$val; // 2 if $val is 1, 1 if $val is 2
        $q = mysql_query("select * from `".$usertable."` where `Value`=".$val." order by rand() limit ".$rows);
        while($r = mysql_fetch_assoc($q)) $result[] = $r;
        break;
    case 2:
        $result[] = mysql_fetch_assoc(mysql_query("select * from `".$usertable."` where `Value`=1 order by rand() limit 1"));
        break;
    // case 3 does nothing special
    }
    // result rows are in $result[] array.
    

    您的mysql\u查询位于错误的位置

    您应该意识到,该查询是在调用mysql\u query的位置执行的,因此您在while中通过同一行一次又一次地循环

    这就是为什么你得到了最长的执行时间

    编辑

    $query = "SELECT * FROM $usertable WHERE Value>0 ORDER BY RAND() LIMIT 1"; //from all positive Values, get one at random
    $query2 = "SELECT * FROM $usertable WHERE Value BETWEEN 1 AND 2 ORDER BY RAND() LIMIT 1"; //from all Values between 1 and 2, get one at random
    $query3 = "SELECT * FROM $usertable WHERE Value=1 ORDER BY RAND() LIMIT 1"; //from all Values equal to 1, get one at random
    
    
    $result = mysql_query($query);
    $row = mysql_fetch_array($result);
    echo $row['A'] . " " . $row['B'] . " " . $row['C'] . " " . $row['Value'];
    echo "<br>";
    
    if ($row['Value'] < 3)
    {
        switch($row['Value'])
        {
            case 2: //If the "Value" is 2, display that row, plus another random row with a "Value" of 1. - thats your query3
                $result3 = mysql_query($query3);
                $row3 = mysql_fetch_array($result3);
                echo $row3['A'] . " " . $row3['B'] . " " . $row3['C'] . " " . $row3['Value'];
                break;
    
            case 1: //If the "Value" is 1, display that row, plus either one more row with a "Value" of 2, or 2 more rows each with a "Value" of 1. - your query2
                $result2 = mysql_query($query2);
                $row2 = mysql_fetch_array($result2);
                echo $row2['A'] . " " . $row2['B'] . " " . $row2['C'] . " " . $row2['Value'];
                if($row2['Value'] == 1)
                { //select another row with value of 1 - your query3
                    $result3 = mysql_query($query3);
                    $row3 = mysql_fetch_array($result3);
                    echo $row3['A'] . " " . $row3['B'] . " " . $row3['C'] . " " . $row3['Value'];
                }
                break;
        }
    }
    
    $query=“SELECT*FROM$usertable WHERE Value>0 ORDER BY RAND()LIMIT 1”;//从所有正值中随机获取一个
    $query2=“从$usertable中选择*其中值介于1和2之间,按兰德排序()限制1”;//从所有介于1和2之间的值中,随机获取一个
    $query3=“从$usertable中选择*其中值=1 ORDER BY RAND()LIMIT 1”;//从所有等于1的值中,随机获取一个
    $result=mysql\u query($query);
    $row=mysql\u fetch\u数组($result);
    回显$row['A'].“”.$row['B'].“”.$row['C'].“”.$row['Value'];
    回声“
    ”; 如果($row['Value']<3) { 开关($row['Value'])) { 案例2://如果“值”为2,则显示该行,再加上另一个“值”为1的随机行。-这是您的查询3 $result3=mysql\u查询($query3); $row3=mysql\u fetch\u数组($result3); 回显$row3['A'].'.$row3['B'.'.'.$row3['C'.'.$row3['Value']; 打破 案例1://如果“值”为1,则显示该行,再加上一行“值”为2,或者再加两行“值”为1。-您的查询2 $result2=mysql\u查询($query2); $row2=mysql\u fetch\u数组($result2); 回显$row2['A'].'.$row2['B'.'.'.$row2['C'.'.$row2['Value']; 如果($row2['Value']==1) {//选择另一个值为1的行-查询3 $result3=mysql\u查询($query3); $row3=mysql\u fetch\u数组($result3); 回显$row3['A'].'.$row3['B'.'.'.$row3['C'.'.$row3['Value']; } 打破 } }

    请注意,此代码可以多次选择一行-您没有提到,行应该是唯一的。如果您需要唯一的行,则需要更改sql代码以不选择allready选定的行(即通过某些唯一标识符或通过返回的完整结果集)

    您可以在SQL中执行此操作。诀窍是处理2+2的情况。您必须忽略第二个

    以下内容通过定义一个
    @sum
    变量来处理此问题。该变量将根据需要以
    递增,并进行一次扭曲。如果该值未命中3,则忽略该行:

    select t.*,
           @sum := if(@prevsum := @sum < 3 and @sum + value > 3, @sum, @sum + value) as thesum
    from (select *
          from t
          where value > 0
          order by RAND()
         ) t cross join
         (select @sum := 0, @prevsum := 0) const
    having (@sum - value) <= 3 and (@prevsum <> @sum)
    
    选择t.*,
    @总和:=如果(@prevsum:=@sum<3和@sum+value>3,@sum,@sum+value)作为总和
    从(选择*
    从t
    其中值>0
    兰德订单()
    )t交叉连接
    (选择@sum:=0,@prevsum:=0)常量
    
    有(@sum-value)PHP 5.5.0开始的PHP函数已经被禁止了。如果您有这样的位置,请考虑更新您的代码来使用OR扩展。我不是PHP专家,但是<代码> > <代码>循环应该如何终止?@乔?弗兰巴赫谢谢您的建议,我将更新一次。让它正常工作(除非使用
    mysqli.
    可以帮我解决问题!)我尝试了这个,但它的显示部分仍然存在问题。我添加了
    while($row=mysql\u fetch\u array($result)){echo$row['A']。$row['B']。$row['C']。$row['Value'];echo'
    }
    到代码块的末尾,但我得到了以下信息:
    警告:mysql\u fetch\u array()希望参数1是resource,在第27行的/home/content/09/10184409/html/trait2.php中给出null
    其中第27行是我的
    while($row=mysql\u fetch\u array($result))
    $result
    是一个数组,而不是MySQL结果。使用我的代码后,使用
    foreach($result as$row)
    可以输出它。你有什么建议如何正确执行吗?我知道我的代码错了,正在寻找一些建议。