踩坑MySQL UNION和ORDER BY混用的问题及解决

 更新时间:2025年09月12日 09:14:57   作者:咖啡Beans  
MySQL中UNION合并多个子集时,内部ORDER BY可能失效,解决方法:各子集添加LIMIT,外层再包裹SELECT并使用ORDER BY,确保整体排序正确

摘要

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

失效场景复现

目的

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

(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。

正确写法

  • 多子集排序字段一致:
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;    -- 外层再按需要整体排序
  • 多子集排序字段不一致:
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。

这些仅为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL 正则表达式用法、模式和注意事项详解

    MySQL 正则表达式用法、模式和注意事项详解

    MySQL正则表达式通过REGEXP/RLIKE操作符实现模式匹配,支持元字符、字符类、量词等基本功能,8.0+版本新增REGEXP_LIKE等函数,提供更强大的文本处理能力,使用时需注意大小写、性能及版本兼容性,本文介绍MySQL 正则表达式详细说明,感兴趣的朋友一起看看吧
    2025-08-08
  • Linux安装mysql并配置外网访问的实例

    Linux安装mysql并配置外网访问的实例

    今天小编就为大家分享一篇Linux安装mysql并配置外网访问的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • Mysql数据库5.7升级到8.4的实现

    Mysql数据库5.7升级到8.4的实现

    很多情况需要升级MySQL的数据库版本,本文主要介绍了Mysql数据库5.7升级到8.4的实现,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-06-06
  • 使用MySQL实现一个分布式锁

    使用MySQL实现一个分布式锁

    在分布式系统中,分布锁是一个最基础的工具类。这篇文章主要介绍了用MySQL实现一个分布式锁,本文通过实例代码相结合给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-12-12
  • MySQL中distinct和group by去重效率区别浅析

    MySQL中distinct和group by去重效率区别浅析

    distinct 与 group by均可用于去重,下面这篇文章主要给大家介绍了关于MySQL中distinct和group by去重效率区别的相关资料,文中介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • mysql 8.0.12安装配置方法图文教程(Windows版)

    mysql 8.0.12安装配置方法图文教程(Windows版)

    这篇文章主要为大家详细介绍了Windows下mysql 8.0.12安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • mysql 8.0.15 安装配置方法图文教程(Windows10 X64)

    mysql 8.0.15 安装配置方法图文教程(Windows10 X64)

    这篇文章主要为大家详细介绍了Windows10 X64 mysql 8.0.15 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • MYSQL更新优化实录

    MYSQL更新优化实录

    本文给大家分享的是个人在对mysql数据进行刷新的时候遇到的一个效率非常低下的问题的解决全过程,主要是针对sql语句来进行优化,有查找问题的方法,有解决方法,非常的详细,小伙伴可以参考下。
    2015-08-08
  • MySQL JSON类型的功能与应用

    MySQL JSON类型的功能与应用

    MySQL8的JSON数据类型为存储和查询JSON数据提供了强大的支持,本文主要介绍了MySQL JSON类型的功能与应用,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • MySQL全量备份的实现

    MySQL全量备份的实现

    全量备份是MySQL数据库备份的常见方式,本文主要介绍了MySQL全量备份的实现,全量备份和增量备份是 MySQL 数据库备份的两种常见方式
    2024-04-04

最新评论