在 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】:
我认为首先你应该知道你的桌子的max
和min
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
的随机问题。如果级别混乱,将很难找出max
和min
id。【参考方案2】:
如果您的行数少于一百万,ORDER BY RAND() LIMIT nn
就不是“杀手”。
如果您仍然认为它是一个杀手,这有多种方法可以获取一些随机行而无需进行全表扫描:http://mysql.rjweb.org/doc.php/random (他们超越了戈多的建议。)
【讨论】:
以上是关于在 MySQL 中选择随机查询的主要内容,如果未能解决你的问题,请参考以下文章