背景:
任務管理系統中,任務列表查詢的時候需要在乙個table中盡心如下排序.首先,按照任務狀態,任務狀態是已領取的始終排在前面,其後是各種狀態的任務,這些按照更新時間進行排序.所以首先想到的是將兩個查詢結果集進行排序然後union.但是在這個過程中會出現很多坑,在此進行總結.
(select t.* from task t where taskstate = '002002' and t.performerid = '13c7c0ae2ff5440880dc572da35722b8' order by t.createtime desc,substr(t.tasktitle from 1 for 9) asc)
union
( select t.* from task t where taskstate != '002001' and taskstate != '002002' and taskstate != '002005' and t.performerid = '13c7c0ae2ff5440880dc572da35722b8'
order by t.updatetime desc,t.createtime desc,substr(t.tasktitle from 1 for 9) asc
)首先,很多帖子說需要在union的兩個子句中需要再查詢一次,嵌乙個select查詢,其實不用使用()同樣可以將order by和union隔離開,多一次結構查詢就多一次效能消耗.
其次,在兩個子句中排好序一旦union順序又亂了,根本不像我們想象的那樣將資料拼裝.解決方法是在兩個子句中加入乙個排序字段,最外層再寫一層查詢.
select * from(
select * from (
select t.* ,00 as sort from task t where taskstate = '002002' and t.performerid = '13c7c0ae2ff5440880dc572da35722b8'
order by createtime desc ,substr(taskdesc from 1 for 9) asc;
) as table1
union all
select * from
(select t.* ,11 as sort
from task t
wheretaskstate != '002001' and taskstate != '002002' and taskstate != '002005' and t.performerid = '13c7c0ae2ff5440880dc572da35722b8'
order by updatetime desc ,substr(taskdesc from 1 for 9) asc
) as table2
) aaa order by sort asc
另外介紹一下,field這個函式,書寫格式為格式:
order by field(字段,值1,值2,...)
這個函式的意思是按照字段首先排值1,然後排值2,依次排序.這個函式在乙個查詢中可以很方便的使用,顯然我們上面的案例不適用
SQL用了Union後的排序問題
最近使用sql語句進行union查詢,驚奇的發現 sql沒問題,union查詢也沒問題,都可以得到想要的結果,可是在對結果進行排序的時候,卻出問題了。1.union查詢沒問題 sql view plain copy select id username mobile time id as leade...
UNION 查詢中的排序
mssql 不允許在union查詢中使用 order by 因此,當我們需要這種功能的時候,就需要繞一些彎路.比如有一張學生表student 和教師表 teacher 我們要查詢所有的教師學生的姓名和年齡,教師排前面,學生排後面,分別按字母順序,則可能會想寫乙個這樣的sql語句 注意,這個語句只是為...
union的謹慎使用
include using namespace std float float666 myfloat 666 myinteger myinteger 1 return myfloat int main float float666 float666 coutmyinteger也被賦值了,myinte...