我正在尝试编写一个 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 个结果。
如果您需要更多代码,我会提供。
最佳答案
带有 id >= (SELECT FLOOR( MAX(id) * 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
请注意,此查询不提供非常公平的行选择。因为它使用 ORDER BY id
,所以它偏向于低编号的行。当您只是尝试选择一个没有其他过滤的随机行时,此方法是合理的,但是当您添加 number = 12
条件时,它就变得不公平了。例如,如果两行的 ID 分别为 50 和 75,您将有 2/3 的时间选择较低的。
您可以通过以下方式获得公正的选择:
SELECT fact
FROM numfacts
WHERE number = '$number'
ORDER BY RAND()
LIMIT 1
关于PHP & MYSQL - ORDER BY id 有时不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40554207/