如何将两个SQL查询与不同的ORDER BY子句组合在一起

use*_*672 0 php mysql sql select sql-order-by

我在线查看,但我只能找到两个相同的 查询order by.

第一个查询:

SELECT
  Name
  , Priority
FROM Music
WHERE `Priority` > 0 AND `date` > '2014-10-27 20:04:25'
ORDER BY `Priority` DESC
Run Code Online (Sandbox Code Playgroud)

第二个查询:

SELECT
  Name
  , Priority
FROM Music
WHERE `Priority` = 0 AND `date` > '2014-10-27 20:04:25'
ORDER BY `date`
Run Code Online (Sandbox Code Playgroud)

我需要将第一个和第二个查询合并为一个,执行第一个查询,然后执行第二个查询,给出一个完整的列表.

Spo*_*ock 5

不仅是1个查询...优先级都是>或= 0

select Name, Priority 
from Music 
where `Priority` >= 0 
AND `date` > '2014-10-27 20:04:25' 
order by `Priority` DESC, `date`
Run Code Online (Sandbox Code Playgroud)


Mur*_*nik 5

你可以使用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
Run Code Online (Sandbox Code Playgroud)

  • 请注意,MySQL不保证外部查询将返回行的顺序; 我们观察到一致的行为,但这不是保证.MySQL允许ORDER BY具有隐式UNION ALL操作,例如`(SELECT ...)UNION ALL(SELECT ...)ORDER BY 2 DESC,1`.但是在这种情况下为什么要使用两个查询,因为我们保证没有重叠. (2认同)