MySQL中使用union all獲得並集的排序

2022-03-09 17:17:53 字數 2128 閱讀 9272

專案中有時候因為某些不可逆轉的原因使得表中儲存的資料難以滿足在頁面中的展示要求。之前的專案上有文章內容的展示功能,文章分為三個狀態待發布、已發布、已下線。他們在資料表中判斷狀態的字段(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=

1and sort_id =

#

order

by sequence_id desc,last_update_date desc

) a)

union

allselect

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=

2and sort_id =

#

order

by release_date desc,last_update_date desc

) b)

union

allselect

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=

0and sort_id =

#

order

by release_date desc,last_update_date desc) c)

Mysql中的Union和Union All查詢

union 用於合併兩個或多個 select 語句的結果集,並消去表中任何重複行。union 內部的 select 語句必須擁有相同數量的列,列也必須擁有相似的資料型別。同時,每條 select 語句中的列的順序必須相同。select name from a union select name fr...

php中使用mysql介紹 PHP中使用MySQL

mysql資料庫的擴充套件 擴充套件庫基本功能相似,用法基本相同,會增加一些新的特性 mysqli擴充套件庫 只能對mysql資料庫操作 pdo擴充套件 可以操作很多態別的資料庫 wamp下修改mysql資料庫密碼 三者在建立連線上的比較 pdo需要四個引數,除了資料庫管理員名稱 密碼 host 還...

mysql 中使用儲存過程

create definer root localhost procedure curdemo begin declare done int default 0 declare userid,repid int declare cur1 cursor for select u.userid,u.re...