1. 程式人生 > 資料庫 >MySQL如何使用union all獲得並集排序

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,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,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,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)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。