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;