MySQL联合返回混合列

时间:2018-07-08 15:09:08

标签: mysql union

有人可以向我解释为什么会这样吗?

我有这个脚本:

(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 个答案:

答案 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))