项目中有时候因为某些不可逆转的原因使得表中存储的数据难以满足在页面中的展示要求. 之前的项目上有文章内容的展示功能, 文章分为三个状态待发布, 已发布, 已下线. 他们在数据表中判断状态的字段 (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)
来源: http://www.bubuko.com/infodetail-2889637.html