抛出问题: 两个表union,他们的列名不一样会影响结果吗?
简单描述下需求
create table t(upper varchar(20), lower varchar(20));
insert into t values ('port1', 'port2'), ('port3', 'port4'), ('port5', 'port6');
现在想获取<upper, lower> 和 <lower, upper>, 查询语句如下
select * from
(select upper AS a, lower as z from t
union
select upper AS z, lower as a from t
) tmp;
一眼看上去好像没啥问题,但实际上输出的结果仍然是
-- upper | lower
-- ------+------
-- port1 | port2
-- port3 | port4
-- port5 | port6
而不是预期的
-- upper | lower
-- ------+------
-- port1 | port2
-- port3 | port4
-- port5 | port6
-- port2 | port1
-- port4 | port3
-- port6 | port5
原因: mysql的union规则是
- 最终结果的列名为 首个select的列名
- union的是 第几列,和别名无关。
所以,为了达成效果,需要修改查询为
select * from
(select upper AS a, lower as z from t
union
select lower AS a, upeer as z from t
) tmp;