我有两个表tt1
和tt2
都包含相同的字段。我想从两个表中按no
对数据进行排序。
表: tt1
CREATE TABLE IF NOT EXISTS `tt1` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`no` varchar(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
INSERT INTO `tt1` (`id`, `no`) VALUES
(1, '1A'),
(2, '3A'),
(3, '2A');
表: tt2
CREATE TABLE IF NOT EXISTS `tt2` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`no` varchar(5) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
INSERT INTO `tt2` (`id`, `no`) VALUES
(1, '2A'),
(2, '3A'),
(3, '1A');
预期输出
ID | No
========
1 | 1A
3 | 1A
1 | 2A
3 | 2A
2 | 3A
2 | 3A
我希望从两个表中以no
字段的升序排列,作为给定的输出我将如何获得。
答案 0 :(得分:4)
在这种情况下,在order by
之后使用select
是错误的(不会返回所需的输出),因为这将分别对两个行集进行排序并在此之后将它们联合起来。
你想要的是订购已经合并的数据,因此你应该只使用order by
一次,在mysql组合表(即组合)之后,因为一旦它组合了表,它就会将所有数据放在一起但是无序,所以当mysql看到order by
时,它会为你整理数据。
样品:
select * from `tt1`
union all
select * from `tt2`
order by `no`
注意:我注意到你的小提琴语法错误了。您需要添加括号:
(select * from tt1 order by no)
union
(select * from tt2 order by no)
注2:感谢@AlmaDo's notice。您不应将*
与union
次查询一起使用。因为修改表列会破坏查询。使用您实际需要的列名称。例如。样本中的查询变为:
select `id`, `no` from `tt1`
union all
select `id`, `no` from `tt2`
order by `no`