MySQL中使用union all获得并集的排序

  项目中有时候因为某些不可逆转的原因使得表中存储的数据难以满足在页面中的展示要求。之前的项目上有文章内容的展示功能,文章分为三个状态待发布、已发布、已下线。他们在数据表中判断状态的字段(PROMOTE_STATUS)值分别为0、1、2。一开始的需求是文章只展示待发布和已发布,已发布排在待发布前面,并且两种状态下在根据自己的情况去排序。这样的实现比较简单,如下的order by语句就可以实现了。

  order by  PROMOTE_STATUS desc ,SEQUENCE_ID desc......

  结果移交测试之后,产品觉得这里可以优化下,文章的展示要改为已发布、待发布、已下线(没错,已下线它突然就要了,而且很傲娇的排在了最后)。那怎么办嘞?改表将已发布、待发布、已下线的PROMOTE_STATUS对应值改为2、1、0肯定是行不通的,因为这个表其他的同事也用了。若是改了这里的对应关系。其他同事的代码的判断逻辑都得动。所以就想到了union all,然后还需要实现文章在三个状态下的各自展示顺序。所以,最终的思路就是将PROMOTE_STATUS分别为1、0、2时的数据查出来,然后根据每种状态下的情况进行order by排序,最后将各个子集union all之后返回给页面展示。

  最终的sql语句如下:

select
    PROMOTE_ID,
    SEQUENCE_ID,
    PROMOTE_STATUS,
       PROMOTE_TITLE,
       RELEASE_DATE
        FROM (
            (SELECT
               PROMOTE_ID,
            SEQUENCE_ID,
            PROMOTE_STATUS,
               PROMOTE_TITLE,
               RELEASE_DATE 
              FROM SYS_TEXT_PROMOTE
              WHERE
                 ENABLED_FLAG = '1'
                 AND PROMOTE_STATUS=1
                 AND SORT_ID = #{params.sortId}
                 order by SEQUENCE_ID DESC,LAST_UPDATE_DATE DESC) a)
union all
select
    PROMOTE_ID,
    SEQUENCE_ID,
    PROMOTE_STATUS,
       PROMOTE_TITLE,
       RELEASE_DATE
        FROM (
            (SELECT
               PROMOTE_ID,
            SEQUENCE_ID,
            PROMOTE_STATUS,
               PROMOTE_TITLE,
               RELEASE_DATE 
              FROM SYS_TEXT_PROMOTE
              WHERE
                ENABLED_FLAG = '1'
                AND PROMOTE_STATUS=2
                AND SORT_ID = #{params.sortId}
                order by RELEASE_DATE DESC,LAST_UPDATE_DATE DESC) b)
union all
select
    PROMOTE_ID,
    SEQUENCE_ID,
    PROMOTE_STATUS,
       PROMOTE_TITLE,
       RELEASE_DATE
        FROM (
            (SELECT
               PROMOTE_ID,
            SEQUENCE_ID,
            PROMOTE_STATUS,
               PROMOTE_TITLE,
               RELEASE_DATE 
              FROM SYS_TEXT_PROMOTE
               WHERE
               ENABLED_FLAG = '1'
               AND PROMOTE_STATUS=0
               AND SORT_ID = #{params.sortId}
               order by RELEASE_DATE DESC,LAST_UPDATE_DATE DESC) c) 

 

 

 

 

    

转载于:https://www.cnblogs.com/8593l/p/10136338.html

MySQLUNIONUNION ALL关键字都是用来合并两个结果集的操作符。然而,它们在使用和效率上有所不同。 UNION操作符在合并结果集后会对结果进行去重操作,即去除重复的记录。这意味着如果两个结果集存在相同的记录,UNION操作符只会返回一次。此外,UNION操作符还会对结果集进行排序运算,以保证结果的顺序一致性。 而UNION ALL操作符则不会进行去重操作,它会返回两个结果集所有的记录,包括重复的记录。由于不需要对结果进行排序,相比于UNION操作符,UNION ALL操作符的执行效率更高。因此,在需要保留重复记录且不需要进行排序的情况下,可以使用UNION ALL操作符。 总结来说,UNION操作符会对结果集进行去重和排序操作,而UNION ALL操作符则不会进行去重和排序操作,只是简单地将两个结果集合并在一起。根据具体的需求,选择合适的操作符可以提高查询的效率和准确性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQL如何使用union all获得并集排序](https://download.csdn.net/download/weixin_38628150/12822985)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MySQLUNIONUNION ALL的基本使用方法](https://download.csdn.net/download/weixin_38666697/13690456)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [基于java SSM+Mysql 的校园新闻系统](https://download.csdn.net/download/qq_35831906/88227122)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值