Mysql在union all 之后order by 失效

复制代码
//不正常的sql
SELECT
    *
FROM
    (
        (
        SELECT
            `class`.`id` as class_id,
            `class`.`name` as class_name,
            `class`.`start_time` AS `startTime`,
            `class_group`.`group_name`,
            `class_group`.`id` AS group_id 
        FROM
            `class`
            LEFT JOIN class_group ON `class_group`.`class_id` = `class`.`id` 
        WHERE
            `class`.`app_id` = '007cd3983760' 
            AND `class_group`.`app_id` = '007cd3983760' 
            AND `class_group`.`deleted_at` IS NULL 
            AND `class`.`deleted_at` IS NULL 
            AND class.start_time >= '2021-08-03' 
            AND class.start_time <= '2021-08-20' 
            order by class.name asc,group_id asc
        ) UNION all
        (
        SELECT
            `class`.`id` as class_id,
            `class`.`name` as class_name,
            `class`.`start_time` AS `startTime`,
            '',
          0
        FROM
            class 
        WHERE
            deleted_at IS NULL 
            AND app_id = '007cd3983760' 
            AND class.start_time >= '2021-08-03' 
            AND class.start_time <= '2021-08-20' 
        ) 
    ) AS class_group_list 
ORDER BY
class_name ASC 
    LIMIT 1,
    20
复制代码

不正常的结果,class_name排序是对了,但是最后一列的group_id不对,按说是group_id = 0的在每个class_name相同组的最前面

 

 

解决问题:

复制代码
//有效的sql
    select * from (    
        SELECT
            `class`.`id` as class_id,
            `class`.`name` as class_name,
            `class`.`start_time` AS `startTime`,
            '',
          0  as group_id
        FROM
            class 
        WHERE
            deleted_at IS NULL 
            AND app_id = '007cd3983760' 
            AND class.start_time >= '2021-08-03' 
            AND class.start_time <= '2021-08-20'
UNION all
SELECT
            `class`.`id` as class_id,
            `class`.`name` as class_name,
            `class`.`start_time` AS `startTime`,
            `class_group`.`group_name`,
            `class_group`.`id` AS group_id 
        FROM
            `class`
            LEFT JOIN class_group ON `class_group`.`class_id` = `class`.`id` 
        WHERE
            `class`.`app_id` = '007cd3983760' 
            AND `class_group`.`app_id` = '007cd3983760' 
            AND `class_group`.`deleted_at` IS NULL 
            AND `class`.`deleted_at` IS NULL 
            AND class.start_time >= '2021-08-03' 
            AND class.start_time <= '2021-08-20' 
         ) cc order by class_name asc ,group_id asc
复制代码

有效的结果

 

posted @   温柔的风  阅读(562)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示