有人可以向我解释为什么会这样吗?
我有这个脚本:
(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
所以,问题是-为什么列要混合??
答案 0 :(得分:1)
因此,现在我意识到,“联合”不会麻烦搜索和匹配来自不同查询的字段,而是-希望字段列表的顺序与第一个查询相同。 而且因为我没有隐式提供字段列表(我用*表示)-每个查询都采用了一些“随机”顺序,所以顺序不匹配。
因此,自动执行的第一个订单是 sid,名称,a_in,id,b_in。 而第二个查询顺序(也是自动执行的)是: sid,id,a_in,名称,b_in。
答案 1 :(得分:1)
你可以试试吗?
(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))