Php SQL如果随机结果的值小于X,则返回更多随机结果,直到达到X值为止?
我有一个表(MySql),其中一列是介于-3和3之间的“值”。 我想做的是: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 = "
$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)
可以输出它。你有什么建议如何正确执行吗?我知道我的代码错了,正在寻找一些建议。