我在线查看,但我只能找到两个与相同 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`
我需要将第一个和第二个查询合并为一个,执行第一个查询,然后执行第二个查询,给我一个完整的列表。
答案 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 > 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 Fiddle
为了更广泛地解决一般问题,让我们假设一些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
如果需要调整/进一步详细说明,请发表评论。