摘要
mysql中对union之后的结果进行排序比较简单, 但业务中也会遇到需要保持各个union结果集自身的排序情况,本文将介绍一种想要保持union前各个查询结果集的排序规则不变的处理方式: 为各个结果集编排独立排序
规则描述与数据准备
数据准备:
create table b
(
id bigint auto_increment primary key,
status varchar(20) null,
ct bigint null,
qt bigint null
);
insert into test.b (id, status, ct, qt) values (1, 'A', 1, 11);
insert into test.b (id, status, ct, qt) values (2, 'A', 2, 22);
insert into test.b (id, status, ct, qt) values (3, 'B', 3, 11);
insert into test.b (id, status, ct, qt) values (4, 'C', 5, 55);
insert into test.b (id, status, ct, qt) values (5, 'D', 4, 44);
insert into test.b (id, status, ct, qt) values (6, 'E', 6, 22);
规则描述
筛选出 qt=22的结果 和qt=11 的结果, 要求qt=22的结果按 id倒叙 而qt=11的结果按id正序
即如下状态:
实现方式
错误方式:
select *
from (
select *
from b
where qt = '22'
order by id desc) tmpa
union
select *
from (
select *
from b
where qt = '11'
order by id asc) tmpb
;
错误结果: 可以看到tmpa id的排序是有问题的, tmpa 这张临时表的排序并没有保持到最终结果中
正确方式:需要为每个union前的结果集增加自己的序列号, union后的最终结果集按照该序列号排序, 添加序列号的方式参考该博客
select *
from (
select (@i := @i + 1) as `sort`, b.*
from b,
(select @i := 0) t
where qt = '22'
order by status desc) tmpa
union
select *
from (
select (@i := @i + 1) as `sort`, b.*
from b,
(select @i := 0) t
where qt = '11'
order by status asc) tmpb
order by sort
;
正确结果:整体结果多了一个sort排序字段, 去掉即可