1. 程式人生 > 資料庫 >mysql union 中使用order by失效

mysql union 中使用order by失效

mysql union 中使用order by失效

目錄

描述

MySQL UNION 操作符用於連線兩個以上的 SELECT 語句的結果組合到一個結果集合中。多個 SELECT 語句會刪除重複的資料。

語法

MySQL UNION 操作符語法格式:

SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions]
UNION [ALL | DISTINCT] // 預設DISTINCT,表示去重了,All 表示執行重複
SELECT expression1, expression2, ... expression_n
FROM tables
[WHERE conditions];

union 和 order by 的通常使用方式

SELECT 列名稱 FROM 表名稱 UNION SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;
SELECT 列名稱 FROM 表名稱 UNION ALL SELECT 列名稱 FROM 表名稱 ORDER BY 列名稱;

union連結的兩個以上select 語句都需要 order by,會失效

語法不正確寫法:報錯。union在沒有括號的情況下只能使用一個order by

SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY score ASC
UNION
SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC

方案一:使用一個order by

方案二:兩個查詢分別加括號,據說order by不能直接出現在union的子句中,但是可以出現在子句的子句中

(SELECT * FROM t1 WHERE username LIKE 'l%' ORDER BY sroce ASC)
UNION
(SELECT * FROM t1 WHERE username LIKE '%m%' ORDER BY score ASC)

方案三:先各自排序,然後通過臨時表巢狀再合併結果,注意排序後面必須加入 limit,否則order by不起作用

SELECT * FROM (SELECT * FROM t1 WHERE id IN (1,3,6) ORDER BY utime DESC limit 5) AS a 
UNION ALL
SELECT * FROM (SELECT * FROM t1 WHERE id IN (2,4,5) ORDER BY utime DESC limit 5) AS b

注:或許對於這種簡單的可能有效,但是一旦兩個查詢的排序複雜,可能就不能用了,例如我經歷的例子,查詢S1 排序=ORDER BY edit_update_time DESC,thumbs_up DESC,查詢S2排序=ORDER BY level DESC,thumbs_up DESC ,edit_update_time DESC,並且最後的結果還要按S1的結果排在S2的結果之前,並且最後還要分頁

在我的例子裡,如上方案都失效
最後的結果按照主鍵ID遞增序

我的成功的解決方案: 使用行號達到排序效果

 select * from (select @rownum := @rownum+1 as t_o,id,uid,show_status,thumbs_up,audit_status,edit_update_time,template_type from tb where uid='xx' and word='yy' and template_type in (1,2,3,4) ORDER BY edit_update_time DESC,thumbs_up DESC ) my_inspiration,(select @rownum:=0)t1 
UNION  
select * from (select @rownum := @rownum+1 as t_o,id,uid,show_status,thumbs_up,audit_status,edit_update_time,template_type from tb where uid!='xx' and word='yy' and show_status=2 and audit_status=1 and template_type in (1,2,3,4) ORDER BY level DESC,thumbs_up DESC ,edit_update_time DESC ) other_inspiration,(select @rownum:=0)t2 ORDER BY t_o asc;