2010-11-24 95 views
8

是否可以對第一個查詢進行排序並將返回的行保留爲第一個,而不是對第二個查詢進行排序。 (如果讓SENCE)MYSQL UNION ORDERING

我目前調查的一個例子是:

SELECT 
    * 
FROM 
    Devices 
WHERE 
    Live = 'true' 
    AND Category = 'apple' 
ORDER BY 
    ListOrder 
UNION 
SELECT 
     * 
    FROM 
     Devices 
    WHERE 
     DeviceLive = 'true' 

我希望該類別蘋果下的設備將在那裏列表的順序組織並會在的頂部列表上方的其他設備。但是這似乎把兩個querys混在一起。

回答

15

你需要引入一個人工排序鍵。喜歡的東西:

SELECT 
    *, 1 as SortKey 
FROM 
    Devices 
WHERE 
    Live = 'true' 
    AND Category = 'apple' 
UNION 
SELECT 
     *, 2 as SortKey 
    FROM 
     Devices 
    WHERE 
     DeviceLive = 'true' 
ORDER BY SortKey, ListOrder 
+0

這就是我過去的成就 – Sonny 2010-11-24 14:17:32

+0

工作就像一種享受,謝謝喬! – Yardstermister 2010-11-24 15:07:43

+0

嗨,我不需要做一個人造的排序鍵,我只是確保每個表都有我想排序的列相同的名稱。在我的情況下,列名是「訂單」。所以我做了:選擇*,按照uOrder的順序從表1 UNION select *,按照uOrder的順序從表2 ORDER BY uOrder – 2014-05-09 16:35:11

2

你可以僞造它

SELECT col1, col2 ... 
FROM (
    SELECT 1 fake_order, col1, col2 ... FROM Devices WHERE Live ='true' AND Category='apple' ORDER BY ListOrder 
    UNION ALL 
    SELECT 2, col1, col2 ... FROM Devices WHERE DeviceLive ='true' 
) AS T 
ORDER BY fake_order 

(未經測試SQL把我的頭頂部)

2

UNION有一個隱式的重複數據刪除功能。這意味着使用它的一個副作用就是一切都混亂在一起,因爲它的排序是爲了發生。它也(通常,但不總是)意味着你得到排序輸出(見下一段)。

UNION ALL消除了這一點,但是,仍然有一個警告,即沒有明確的order by的查詢輸出沒有保證排序。這已經被另一個答案覆蓋了,但我認爲值得指出它的重要性。

0

我從喬·斯特凡內利我的答案,但修改了一點:

嗨,我也沒必要做人工排序關鍵字,我只是確保每個表都有過的同名專欄我想排序。在我的情況下,列名是「訂單」。所以我做了:

Select *, order as uOrder from table 1 
UNION 
select *, order as uOrder from table 2 
ORDER BY uOrder