MySQL中UNION ALL子查询单独使用ORDER BY和LIMIT的解决方案问询
解决MySQL中UNION ALL子查询单独使用ORDER BY和LIMIT的问题
嘿,这个问题我之前也踩过坑!MySQL确实不允许在UNION ALL的直接子查询里单独用ORDER BY,但只要给每个子查询套一层派生表,就能实现你要的每个子查询单独排序+限制条数,再合并结果的需求了。
具体实现方案
把每个需要单独处理的查询用括号包裹成派生表,并且给每个派生表指定一个别名(MySQL强制要求派生表必须有别名),示例代码如下:
SELECT x, y, z FROM ( SELECT x, y, z FROM tbl1 WHERE z = 'xxxx' AND y = 111 AND x = 'text' ORDER BY rand() LIMIT 11966 ) AS sub1 UNION ALL SELECT x, y, z FROM ( SELECT x, y, z FROM tbl1 WHERE z = 'xxxx' AND y = 222 AND x = 'text' ORDER BY rand() LIMIT 35 ) AS sub2 -- 可以继续添加更多同结构的子查询块
原理说明
派生表会优先执行内部的ORDER BY和LIMIT逻辑,先筛选出符合条件的指定条数随机数据,再将这些预处理后的子集通过UNION ALL合并成最终结果,完美绕开了MySQL的语法限制。
如果需要对合并后的整体结果再做排序,直接在整个语句末尾追加ORDER BY即可,比如:
-- 接上面的代码 ORDER BY y, x;
内容的提问来源于stack exchange,提问作者George C. Serban
相关产品推荐
相关产品推荐

