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

时间:2015-01-13 20:51:06

标签: 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

第二次查询:

SELECT
  Name
  , Priority
FROM Music
WHERE `Priority` = 0 AND `date` > '2014-10-27 20:04:25'
ORDER BY `date`

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

3 个答案:

答案 0 :(得分:5)

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

select Name, Priority 
from Music 
where `Priority` >= 0 
AND `date` > '2014-10-27 20:04:25' 
order by `Priority` DESC, `date`

答案 1 :(得分: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

答案 2 :(得分:4)

虽然将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 Fiddle

更新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
如果需要调整/进一步详细说明,请发表评论。