他們在數據表中判斷狀態的字段(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之后返回給頁面展示。
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)