[英]How to combine two SQL queries with different ORDER BY clauses
我在網上看過,但只能找到兩個查詢,它們的order by
相同 。
第一個查詢:
SELECT
Name
, Priority
FROM Music
WHERE `Priority` > 0 AND `date` > '2014-10-27 20:04:25'
ORDER BY `Priority` DESC
第二個查詢:
SELECT
Name
, Priority
FROM Music
WHERE `Priority` = 0 AND `date` > '2014-10-27 20:04:25'
ORDER BY `date`
我需要將第一個查詢和第二個查詢合並為一個,在其中執行第一個查詢,然后執行第二個查詢,這給出了完整的列表。
不僅是1個查詢...優先級都是>或= 0
select Name, Priority
from Music
where `Priority` >= 0
AND `date` > '2014-10-27 20:04:25'
order by `Priority` DESC, `date`
您可以使用union all
運算符。 不幸的是, union [all]
不允許對每個查詢應用order by
子句,因此需要一些技巧。 例如,您可以在子查詢中“隱藏” order by
子句:
SELECT *
FROM (SELECT Name, Priority
FROM Music
WHERE `Priority` > 0 AND `date` > '2014-10-27 20:04:25'
ORDER BY `Priority` DESC) t
UNION ALL
SELECT *
FROM (SELECT Name, Priority
FROM Music
WHERE `Priority` = 0 AND `date` > '2014-10-27 20:04:25'
ORDER BY `date`) s
雖然將priority > 0
和priority = 0
合並為priority >= 0
似乎很合理,但是嚴格地說,第二個查詢的排序順序必須 不應用於第一個查詢的數據。 由於沒有有關實際數據的詳細信息,因此很難說出是否有所作為。 但是,如果有疑問(並且OP確實明確指出了事實),我會選擇
SELECT
name
, priority
FROM MUSIC
WHERE priority >= 0
AND date > '2014-10-27 20:04:25'
ORDER BY priority DESC, CASE priority WHEN 0 THEN date END
;
我用一些假數據對@Spock的結果進行了測試,實際上得到了不同的結果:
SQL小提琴
為了在更大范圍內解決一般問題,讓我們假設一些WHERE
條件,它們不那么容易組合成一個條件:
SELECT
name
, priority
, date
FROM MUSIC
WHERE priority > 1
AND date > '2014-10-27 20:04:25'
ORDER BY priority DESC, date DESC
;
SELECT
name
, priority
, date
FROM MUSIC
WHERE priority <= 1
AND date < '2014-10-26 00:00:00'
ORDER BY date
;
可以通過以下方式解決:
SELECT
name
, priority
, date
FROM
(SELECT
1 resultSet
, name
, priority
, date
FROM MUSIC
WHERE priority > 1
AND date > '2014-10-27 20:04:25'
UNION ALL
SELECT
2 resultSet
, name
, priority
, date
FROM MUSIC
WHERE priority <= 1
AND date < '2014-10-26 00:00:00'
) T
ORDER BY resultSet,
CASE resultSet
WHEN 1 THEN priority
END DESC,
CASE resultSet
WHEN 1 THEN date
END DESC,
CASE resultSet
WHEN 2 THEN date
END
;
因此,我們引入resultSet
來獲取它們的每個句柄,並指定特定的排序條件。
實際運行中看一下: SQL Fiddle
請評論,如果並且因為這需要調整/進一步的細節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.