有人能给我解释一下为什么会这样吗?
我有这个脚本:
(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
所以,问题是-为什么列是混合的?
发布于 2018-07-09 00:58:51
你能试试这个吗?
(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))
发布于 2018-07-09 00:52:31
因此,现在我意识到'Union‘不需要费心搜索和匹配来自不同查询的字段,而是期望字段列表的顺序与第一个查询相同。而且因为我没有隐式地提供字段列表(我使用了*) -它对每个查询采取了一些“随机”顺序,并且顺序不匹配。
因此,自动获取的第一个顺序是sid、name、a_in、id、b_in。而第二个查询顺序(也是自动获取的)是: sid、id、a_in、name、b_in。
https://stackoverflow.com/questions/51233303
复制相似问题