有人能解释一下为什么会这样吗?
我有这个剧本:
(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
所以,问题是-为什么列是混合的??
2条答案
按热度按时间2j4z5cfb1#
你能试试这个吗?
xmakbtuz2#
所以,现在我意识到“union”不需要搜索和匹配来自不同查询的字段,而是希望字段列表的顺序与第一个查询相同。因为我没有隐式地提供字段列表(我使用了*)—所以每个查询都需要一些“随机”顺序,而且顺序不匹配。
所以,第一个顺序是sid,name,a\u in,id,b\u in。而第二个查询顺序(也是自动执行的)是:sid,id,a\u-in,name,b\u-in。