有几次我用来选择随机行:
$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)
但是,有时只会显示:
()
为什么这样?我做错了什么?
答案 0 :(得分:0)
我认为首先你应该知道你的max
和min
个人的身份:
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变量,生成零和行号之间的行号:
$randNum = rand(0, $rowCount);
然后像这样运行查询:
SELECT * FROM questions LIMIT $rowNumber, 1
答案 1 :(得分:0)
如果您的行数不到一百万,ORDER BY RAND() LIMIT nn
就不是&#34;杀手&#34;。
如果您仍然认为它是一个杀手,这有多种方法可以获得一些随机行而无需进行全表扫描:http://mysql.rjweb.org/doc.php/random (他们超越了戈多的建议。)