3
 (SELECT `size`, `type` FROM `table` WHERE `type`='a' ORDER BY `size` ASC)
UNION ALL 
(SELECT `size`,`type` FROM `table` WHERE `type`='b' ORDER BY `size` DESC)

为什么这个查询没有像我希望的那样工作?它将结果数组分成“a”类型,然后是“b”类型,但在“a”类型结果中,它们不按大小排序(大小是正的 bigint)。

有什么建议么?:)

4

1 回答 1

7

查询的结果是没有顺序的,除非你使用了一个order by子句(或者在 MySQL 中是一个group by子句)。试试这个来得到你想要的:

(SELECT `size`, `type` FROM `table` WHERE `type`='a')
UNION ALL 
(SELECT `size`,`type` FROM `table` WHERE `type`='b')
order by type,
         (case when `type` = 'a' then size end) asc,
         (case when `type` = 'b' then size end) desc;

子查询上的排序子句通常被忽略(例外是当你有 时limit)。而且,即使不被忽略也可能不会对外部查询产生影响。

实际上,union all完全忘记:

select size, `type`
from table
where type in ('a', 'b')
order by type,
         (case when `type` = 'a' then size end) asc,
         (case when `type` = 'b' then size end) desc;

type子句中的第一个order by是不必要的,但我确实认为它使排序的意图更清楚。

于 2013-05-18T14:20:36.253 回答