PHP& MYSQL - ORDER BY id有时不返回任何内容

时间:2016-11-11 18:39:44

标签: php mysql random web

我正在尝试编写一个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结果。

如果您需要更多代码,我会提供。

2 个答案:

答案 0 :(得分:0)

如果子查询SELECT FLOOR( MAX(id) * RAND()) FROM numfacts将返回少于$number的内容,则整个查询将不返回任何内容。

答案 1 :(得分:0)

带有WHERE的{​​{1}}子句的部分限制查询查找表的子集。如果id >= (SELECT FLOOR( MAX(id) * RAND()) FROM numfacts )的两行不在此子集中,则查询不会返回任何内容。由于子集是随机指定的,因此只会在某些时候发生。

要确保子集至少包含一个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 ,所以它偏向于低编号的行。当您只是尝试选择没有其他过滤的随机行时,此方法是合理的,但是当您添加ORDER BY id条件时,这会变得不公平。例如,如果两行的ID分别为50和75,那么您将在2/3的时间内选择较低的一行。

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

number = 12