首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL union返回混合列

MySQL union返回混合列
EN

Stack Overflow用户
提问于 2018-07-08 23:09:08
回答 2查看 181关注 0票数 0

有人能给我解释一下为什么会这样吗?

我有这个脚本:

代码语言:javascript
复制
(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));

这些表包括:

代码语言:javascript
复制
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;

出于某种原因,结果好坏参半:

代码语言:javascript
复制
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

预期结果应该是:

代码语言:javascript
复制
sid name    a_in    id      b_in
2   me      3       2       3
3   hhh     3       3       2
1   hello   2       1       3

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-09 00:58:51

你能试试这个吗?

代码语言:javascript
复制
(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))
票数 1
EN

Stack Overflow用户

发布于 2018-07-09 00:52:31

因此,现在我意识到'Union‘不需要费心搜索和匹配来自不同查询的字段,而是期望字段列表的顺序与第一个查询相同。而且因为我没有隐式地提供字段列表(我使用了*) -它对每个查询采取了一些“随机”顺序,并且顺序不匹配。

因此,自动获取的第一个顺序是sid、name、a_in、id、b_in。而第二个查询顺序(也是自动获取的)是: sid、id、a_in、name、b_in。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51233303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档