如何修复MySQL查询返回结果行数不一致的问题
问题诱因
- 核心原因是MySQL中
UNION运算符的默认特性:会自动对多个子查询返回的结果集做去重处理,合并所有字段值完全相同的行。 - 你的前两个子查询均为筛选
Rate=75的记录后随机取1行,当两次随机查询抽到了完全一致的行时,UNION就会删除重复的那一行,最终仅返回2行结果。 - 额外说明:
UNION的去重逻辑会额外消耗排序计算资源,无去重需求时使用UNION也会降低查询性能。
修复方案
- 将语句中的
UNION全部替换为UNION ALL即可。UNION ALL不会执行去重逻辑,会原样保留所有子查询的返回结果,完全满足你需要返回3行的需求,同时查询性能也更高。 - 修正后的查询语句如下:
(SELECT * FROM names WHERE Rate = 75 ORDER BY RAND() LIMIT 1) UNION ALL (SELECT * FROM names WHERE Rate = 75 ORDER BY RAND() LIMIT 1) UNION ALL (SELECT * FROM names WHERE Rate = 35 ORDER BY RAND() LIMIT 1);
内容的提问来源于stack exchange,提问作者Jimboy
相关产品推荐
相关产品推荐

