Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP&MYSQL-orderbyid有时不返回任何内容_Php_Mysql_Random_Web - Fatal编程技术网

PHP&MYSQL-orderbyid有时不返回任何内容

PHP&MYSQL-orderbyid有时不返回任何内容,php,mysql,random,web,Php,Mysql,Random,Web,我试图编写一个PHP脚本,从MYSQL表中随机抽取一行。到目前为止,代码成功地抓取了一个随机行,但有时它什么也不返回,我不明白为什么 $result = $conn->query("SELECT fact FROM numfacts WHERE number = '".(string)$number."' AND id >= (

我试图编写一个PHP脚本,从MYSQL表中随机抽取一行。到目前为止,代码成功地抓取了一个随机行,但有时它什么也不返回,我不明白为什么

$result = $conn->query("SELECT fact 
                        FROM numfacts 
                        WHERE number = '".(string)$number."' 
                            AND id >= (SELECT FLOOR( MAX(id) * RAND()) FROM numfacts ) 
                        ORDER BY id 
                        LIMIT 1");
$number的值当前为12,数据库中有两行包含该值。大约2/3倍的代码返回一个值,另外1/3倍的代码返回0个结果

如果你需要更多的代码,我会提供它。

如果子查询从numfacts选择FLOOR MAXid*RAND将返回小于$number的内容,则整个查询将不返回任何内容。

如果子查询从numfacts选择FLOOR MAXid*RAND将返回小于$number的内容,则整个查询将不返回任何内容。

带有id>=SELECT的WHERE子句部分numfacts中的FLOOR MAXid*RAND将查询限制为查找表的子集。如果number=12的两行不在此子集中,则查询不会返回任何内容。由于子集是随机指定的,所以这种情况只会在某些时候发生

要确保子集至少包含一个number=12的行,可以在子查询中包含该条件

SELECT fact
FROM numfacts 
WHERE number = '".(string)$number."' 
    AND id >= (SELECT FLOOR( MAX(id) * RAND()) 
               FROM numfacts
               WHERE number = '$number' ) 
ORDER BY id 
LIMIT 1
请注意,此查询没有提供非常公平的行选择。因为它使用按id排序,所以它偏向于编号较低的行。当您只是尝试在没有其他筛选的情况下选择一个随机行时,这种方法是合理的,但是当您添加number=12标准时,它就变得不公平了。例如,如果两行的ID分别为50和75,则将选择时间的2/3中较低的一行

您可以通过以下方式获得无偏选择:

SELECT fact
FROM numfacts
WHERE number = '$number'
ORDER BY RAND()
LIMIT 1
id>=SELECT FLOOR MAXid*RAND FROM numfacts的WHERE子句部分将查询限制为查找表的子集。如果number=12的两行不在此子集中,则查询不会返回任何内容。由于子集是随机指定的,所以这种情况只会在某些时候发生

要确保子集至少包含一个number=12的行,可以在子查询中包含该条件

SELECT fact
FROM numfacts 
WHERE number = '".(string)$number."' 
    AND id >= (SELECT FLOOR( MAX(id) * RAND()) 
               FROM numfacts
               WHERE number = '$number' ) 
ORDER BY id 
LIMIT 1
请注意,此查询没有提供非常公平的行选择。因为它使用按id排序,所以它偏向于编号较低的行。当您只是尝试在没有其他筛选的情况下选择一个随机行时,这种方法是合理的,但是当您添加number=12标准时,它就变得不公平了。例如,如果两行的ID分别为50和75,则将选择时间的2/3中较低的一行

您可以通过以下方式获得无偏选择:

SELECT fact
FROM numfacts
WHERE number = '$number'
ORDER BY RAND()
LIMIT 1

ORDER BY id desc或ORDER BY id asc什么?ORDER BY id desc或ORDER BY id asc什么?查询从不将该随机数与$number进行比较。糟糕,条件中有number和id。你的答案更清楚了。查询从未将该随机数与$number进行比较。糟糕,条件中有number和id。你的答案更清楚了。我明白了,有没有其他方法可以得到一个更无偏的随机数?使用选择。。。按随机顺序限制1我明白了,有没有其他方法可以得到更无偏的随机数?使用选择。。。按兰特限购1