踩坑无数!MySQL UNION和ORDER BY混用的血泪教训,看完不再翻车

摘要

本文介绍MySQL中使用union多个子集导致排序失效的场景如何解决。

失效场景复现

目的

想先让A表按id升序,再让B表按id降序,然后拼在一起,最终想保证顺序一致

sql 复制代码
(SELECT id, name FROM A ORDER BY id ASC)
UNION
(SELECT id, name FROM B ORDER BY id DESC);

结果

A或B内单独查询顺序无误,但UNION后排序反而乱了...

原因

mysql8.0官方给的解释是:UNION分支里的ORDER BY会被优化器直接扔掉,想让单个分支先排好序,必须在该分支里再加一个LIMIT任意大数,并且最后把整个UNION再包一层SELECT,在最外层写ORDER BY。

正确写法

  • 多子集排序字段一致:
vbnet 复制代码
SELECT * FROM (
  SELECT id, name, 1 AS seq    -- 用常量列保住先后顺序
  FROM A
  ORDER BY id ASC
  LIMIT 99999999    -- 必须加LIMIT,否则ORDER BY会被优化掉
) a
UNION
SELECT * FROM (
  SELECT id, name, 2 AS seq
  FROM B
  ORDER BY id DESC
  LIMIT 99999999
) b
ORDER BY seq, id;    -- 外层再按需要整体排序
  • 多子集排序字段不一致:
vbnet 复制代码
SELECT * FROM (
  SELECT id, create_time, 1 AS seq    -- 用常量列保住先后顺序
  FROM table_A
  ORDER BY create_time ASC
  LIMIT 99999999    -- 必须加LIMIT,否则ORDER BY会被优化掉
) a
UNION
(
  SELECT id, create_time, 2 AS seq
  FROM table_B
  ORDER BY id DESC
  LIMIT 99999999
) b
ORDER BY seq;    -- 仅保证先A后B,不再对内部二次排序

总结

以上我们了解了mysql中union多个子集时防止子集内的排序失效的做法,子集写limit,外层再包含,最终再order。

关注公众号:咖啡Beans

在这里,我们专注于软件技术的交流与成长,分享开发心得与笔记,涵盖编程、AI、资讯、面试等多个领域。无论是前沿科技的探索,还是实用技巧的总结,我们都致力于为大家呈现有价值的内容。期待与你共同进步,开启技术之旅。

相关推荐
心中有你02144 分钟前
Java实现Dijkstra最短路径算法(邻接表 + 优先队列)
java·数据库·算法
龙亘川19 分钟前
综合素质评价业务建模:从过程性评价到成长档案全链路闭环
数据库·智慧城市·数据可视化
数据库小组25 分钟前
NineData 实战教程:MySQL 5.5 数据迁移同步到 MySQL 8.0(跨版本升级)
数据库·mysql·mysql优化·数据库开发·数据库迁移·版本升级·数据复制
zhangjw341 小时前
1-5 PostgreSQL 数据类型全集:基础类型、字符串、数值、时间类型
数据库·postgresql
王中阳Go1 小时前
5.27 分钟干完后端和全部测试:一场三小时笔试的五个失分点,四个不在代码上
大数据·数据库·人工智能·后端·大语言模型
cnskylee2 小时前
【MySQL】麒麟V10 SP3系统安装MySQL-Commercial-8.0.46
数据库·mysql·adb
梦幻通灵2 小时前
修改MySQL数据库递增序列【持续更新】
数据库·mysql
liminla!2 小时前
SQL 从入门到进阶:语法速查与实战练习(完整优化版)
数据库·sql·算法
tongyiixiaohuang2 小时前
供应商主数据同步实战:从易快报到金蝶云星空的单一策略落地
java·网络·数据库
大侠归来3 小时前
常用 MySQL 分库分表方案详解
数据库·mysql