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

标签 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 个结果。

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

最佳答案

带有 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/

相关文章:

python - 将不重复的随机数 append 到列表中

php - 使用 AJAX 调用特定 PHP 函数

php - 将 noindex header 添加到 php 重定向文件

java - JDBC 在使用 LOAD DATA LOCAL INFILE 时是否有相对路径选项?

php - 如何处理重复条目的错误?

php - 图片无法在 PHP 中上传

php - 为什么浏览器窗口关闭只有一半的时间有效

php - PHP5支持unicode&多语言的策略

java - 如何获取特定范围内的随机数

sql - 如何使用另一个表中的随机行更新表的每一行