mysql union返回混合列

dddzy1tm  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(276)

有人能解释一下为什么会这样吗?
我有这个剧本:

(select * from (select * from a where a_in > 2) t1 LEFT join b using (sid)) 
union 
(select * from a right join (select * from b where b_in > 2) t2 using (sid));

这些表格是:

a
sid name    a_in
1   hello   2
2   me      3
3   hhh     3

b
id sid b_in
1   1   3
2   2   3
3   3   2

CREATE TABLE `a` (
  `sid` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) DEFAULT NULL,
  `a_in` int(11) DEFAULT NULL,
  PRIMARY KEY (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

CREATE TABLE `b` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `sid` int(11) DEFAULT NULL,
  `b_in` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

出于某种原因,结果是喜忧参半:

sid name    a_in    id      b_in
2   me      3       2       3
3   hhh     3       3       2
1   1       3       hello   2
2   2       3       me      3

预期结果应该是:

sid name    a_in    id      b_in
2   me      3       2       3
3   hhh     3       3       2
1   hello   2       1       3

所以,问题是-为什么列是混合的??

2j4z5cfb

2j4z5cfb1#

你能试试这个吗?

(select t1.*,b.* from (select * from a where a_in > 2) t1 LEFT join b using (sid)) 
union 
(select a.*,t2.* from a right join (select * from b where b_in > 2) t2 using (sid))
xmakbtuz

xmakbtuz2#

所以,现在我意识到“union”不需要搜索和匹配来自不同查询的字段,而是希望字段列表的顺序与第一个查询相同。因为我没有隐式地提供字段列表(我使用了*)—所以每个查询都需要一些“随机”顺序,而且顺序不匹配。
所以,第一个顺序是sid,name,a\u in,id,b\u in。而第二个查询顺序(也是自动执行的)是:sid,id,a\u-in,name,b\u-in。

相关问题