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

标签 php mysql sql random

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

  1. 如果“值”为正数(在我的例子中为 1 到 3 - 负值将用于其他用途且与此处无关),则从表中随机抽取一行
  2. 如果“值”为 3,则仅显示该行。
  3. 如果“值”为 2,则显示该行以及“值”为 1 的另一个随机行。
  4. 如果“值”为 1,则显示该行,加上“值”为 2 的另外一行,或者“值”为 1 的另外 2 行。
或者,换句话说,我需要列出行,直到它们的总值为 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>";
        }
    }

我尝试将 while 语句放在不同的顺序中,但我不断收到意外的 T_WHILE 错误。

按照我现在的方式,代码将运行并超时并出现以下错误: “ fatal error :超出最大执行时间 30 秒” 而且它没有做我需要做的事情(如果第一个“值”是 3,它仍然会提取结果)。

谁能指出我做错了什么?一定有比我正在做的更好的方法来完成这个场景,但我只是没有看到它。有人能指出我正确的方法吗?谢谢!

最佳答案

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

下面通过定义一个@sum变量来处理这个问题。该值会根据需要按 value 递增,只需稍加调整即可。如果该值缺少 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)

这会维护@prevsum​​,因此它知道在“2 + 2”或“1 + 1 + 2”等情况下忽略最后一行。

关于php - SQL如果随机结果的值小于X,则返回更多随机结果,直到达到X值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17198214/

相关文章:

javascript - 如何使用云存储分段上传音乐/视频(适用于 Laravel)?

php - 无法写入 session 数据 magento

mysql - 替换 MySQL 中的列

MySQL - 舍入(某种程度) - 仅当大于/小于 10 时才需要舍入数字

mysql - 选择至少包含一列可能值的 n 行

sql - 使用 BigQuery 访问 Google Analytics 自定义维度

php - PHP解析/语法错误;以及如何解决它们

php - 验证 FTP 凭据

mysql - 地理数据存入数据库用于报告

sql - 选择进入表计数