我正试图编写一个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个结果。
如果你需要更多的代码,我可以提供
WHERE
子句的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
,所以它偏向于低编号的行。当您只是试图选择没有其他过滤的随机行时,这种方法是合理的,但是当您添加number = 12
标准时,它就变得不公平了。例如,如果这两行的id分别为50和75,您将有2/3的几率选择较低的行。
您可以使用:
获得无偏选择:SELECT fact
FROM numfacts
WHERE number = '$number'
ORDER BY RAND()
LIMIT 1
如果子查询SELECT FLOOR( MAX(id) * RAND()) FROM numfacts
返回的值小于$number
,则整个查询将不返回任何值。