mysql union 排序_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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2020-03-19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值