MySQL如何使用union all獲得並集排序

2022-09-27 05:54:14 字數 2023 閱讀 7303

專案中有時候因為某些不可逆轉的原因使得表中儲存的資料難以滿足在頁面中的展示要求。之前的專案上有文章內容的展示功能,文章分為三個狀態待發布、已發布、已下線。

他們在資料表中判斷狀態的字段(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 = #

order by sequence_id desc,last_update_date desc) a)

union all

select

promote_id,

sequence_id,

promote_status,

promote_title,

release_date

fromwww.cppcns.com (

(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 = #

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_pwww.cppcns.comromote

where

程式設計客棧 enabled_flag = '1'

and promote_status=0

and sort_id = #

order by release_date desc,last_update_date desc) c)

本文標題: mysql如何使用union all獲得並集排序

本文位址:

mysql如何使用索引 MySQL是如何使用索引的

閒扯 很多時候我們面對很慢的查詢的時候會一籌莫展,這個時候大部分人都會很自然的想到建索引這條路。事實上索引確實是個很好的優化方式,乙個良好的索引能夠提公升不止一倍的效率,還能帶來併發能力的提公升。但是索引也不是萬能的,不然的話我大可以給一張表的所有列上都加上索引,但是基本上所有的dba都會有一條認知...

MySQL如何使用索引

概念 索引用於快速查詢具有特定列值的行。沒有索引,mysql必須從第一行開始,然後通讀整個表以找到相關的行。表越大,耗費時間越多。如果表中有相關列的索引,mysql可以快速確定要在資料檔案中間查詢的位置,而不必檢視所有資料。這比順序讀取每一行要快得多。大多數mysql索引 primary key,u...

mysql 快取如何使用記憶體

先說明2點 開啟快取也會帶來開銷,主要表現在一下方面 讀取在查詢開始之前必須要檢查快取 如果查詢是快取的,但是不在結果集中,那麼產生結果後儲存資料會帶來一定的開銷 向快取寫如資料也會帶來開銷 有的情況查詢快取不會被快取,即使你使用 sql cache也不能快取 主要一下幾個 引用了使用者自定義函式 ...