簡體   English   中英

如何將兩個SQL查詢與不同的ORDER BY子句組合

[英]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 > 0priority = 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小提琴

更新2015-08-08

為了在更大范圍內解決一般問題,讓我們假設一些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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM