You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从MySQL数据库无重复获取随机行?在线答题场景需求

解决MySQL随机排序出现重复行的问题

我完全懂你在搭建在线答题系统时遇到的糟心情况——想用SELECT * from mst_que ORDER BY RAND()随机展示20道题,结果居然出现了重复行,这肯定会影响用户答题体验。咱们一步步来排查和解决:

第一步:先排查表本身的重复数据

首先要确认你的mst_que表是不是本身就存在重复的题目记录。这是最常见的原因,你可以用下面的SQL检查(假设que_id是题目唯一标识,没有的话可以用题目内容字段,比如que_content):

SELECT que_id, COUNT(*) 
FROM mst_que 
GROUP BY que_id 
HAVING COUNT(*) > 1;

如果查询返回了结果,说明表中有重复数据,你需要先清理这些重复项(比如保留一条,删除其他重复行)。

第二步:确保随机排序的查询逻辑正确

如果表数据本身是唯一的,那可能是查询逻辑的问题,试试下面几种更可靠的写法:

写法1:先去重再随机排序

如果你的表可能存在重复(比如导入数据时的失误),可以先去重再排序,保证结果无重复:

SELECT DISTINCT * 
FROM mst_que 
ORDER BY RAND();

如果用主键去重会更高效,适合数据量稍大的情况:

SELECT q.* 
FROM (SELECT DISTINCT que_id FROM mst_que) AS d 
JOIN mst_que AS q ON d.que_id = q.que_id 
ORDER BY RAND();

写法2:针对固定数量的随机查询(你的场景是20道题)

既然你明确只需要展示全部20道题的随机顺序,而且表中正好是20条唯一记录,直接用LIMIT约束也能确保结果完整且无重复:

SELECT * 
FROM mst_que 
ORDER BY RAND() 
LIMIT 20;

这种写法也能避免一些极端情况下的排序异常。

写法3:更高效的随机排序(适合未来题量增加的情况)

如果以后你的题库题量变大,直接ORDER BY RAND()会越来越慢,这时候可以用基于主键的子查询来优化,同时保证无重复:

SELECT * 
FROM mst_que 
WHERE que_id IN (SELECT que_id FROM mst_que ORDER BY RAND()) 
ORDER BY RAND();

额外提醒

如果以上方法都试过还是有重复,那要检查你的业务代码是不是多次执行了这个查询并拼接结果,或者有没有缓存逻辑导致重复展示——这种情况和SQL本身无关,需要从代码层面排查。

内容的提问来源于stack exchange,提问作者Mahesh Manjunath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:45:10