我正在尝试编写一个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结果。
如果您需要更多代码,我会提供。
答案 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