在 MySQL 中选择随机查询

Posted

技术标签:

【中文标题】在 MySQL 中选择随机查询【英文标题】:Select Random query in MySQL 【发布时间】:2018-10-04 20:30:07 【问题描述】:

有几次我用来选择随机行:

$get_question = $user_home->runQuery('SELECT * FROM questions WHERE Level = :Level ORDER BY RAND()');

一位专家告诉我,

RAND() 是杀死 mysql 服务器的秘诀!

所以,在this answer 的帮助下,我尝试了:

$get_question = $user_home->runQuery('SELECT * FROM questions AS r1 JOIN (SELECT CEIL(RAND() * (SELECT MAX(Sr) FROM questions)) AS Sr) AS r2 WHERE r1.Sr >= r2.Sr AND Level = :Level ORDER BY r1.Sr ASC LIMIT 1');

这就是我显示结果的方式:

echo $fetch_question['Question'] . "(" . $fetch_question['Id'] . ")";

然后显示是:

question(id)

但是,有时它只显示:

()

为什么会这样?我做错了什么?

【问题讨论】:

为什么不直接获取所有行,然后为每个 php 选择一个随机行? @wayneOS 每个查询我只需要一行,这里的数据库只有 15 个(每个Level 5 个)用于理解,实际上有 10K+ 问题... 如果使用 RAND() 没有给您带来任何问题,为什么要更改? OP 提到了RAND() is a recipe for killing MySQL server !! 然而...如果Rand() 工作正常,为什么不使用它呢? “专家”的建议听起来很可疑(但我不是专家,只是有人会使用 Rand() 如果它对我有用。 【参考方案1】:

我认为首先你应该知道你的桌子的maxmin id:

select max(id) as mx , min(id) as mn  from questions 

然后从 PHP:

生成随机 id
$randomId = rand($min, $max);

然后使用此$randomId 运行您的查询:

SELECT * FROM questions WHERE id = $randomId

更新:

首先获取整数行数:

SELECT COUNT(*) FROM questions 

解压到PHP变量中,生成0到行号之间的行号:

$randNum = rand(0, $rowCount);

然后像这样运行查询:

SELECT * FROM questions LIMIT $rowNumber, 1

【讨论】:

只有当您的记录没有空白时,ID 上的平等比较才有效。 OP 也有commented,显示的表格只是一个例子,OP 想要一个来自特定Level随机问题。如果级别混乱,将很难找出maxmin id。【参考方案2】:

如果您的行数少于一百万,ORDER BY RAND() LIMIT nn 就不是“杀手”。

如果您仍然认为它是一个杀手,这有多种方法可以获取一些随机行而无需进行全表扫描:http://mysql.rjweb.org/doc.php/random (他们超越了戈多的建议。)

【讨论】:

以上是关于在 MySQL 中选择随机查询的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 从每个类别中选择一个随机记录

针对另一个表的随机 MySQL 查询验证

mysql - 子查询和连接

随机记录 Mysql PHP

Mysql中随机查询数据的几种算法

随机选择,但每个名称都应至少选择一次