Mysql排序字母数字数据

时间:2014-07-09 09:59:07

标签: mysql

我有两个表tt1tt2都包含相同的字段。我想从两个表中按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字段的升序排列,作为给定的输出我将如何获得。

SQLFiddle

1 个答案:

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