mysql union错误的列结果

时间:2012-07-30 01:54:13

标签: mysql union

使用union时出现错误的列名。

这是我的工作,我有两个非常大的表,具有相同的结构和不同的记录,所以在这里。

mysql> select * from e18 where `15` like '%car%' limit 1;
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
| id   | 1    | 2  | 3    | 4    | 5    | 6    | 7    | 8    | 9    | 10   | 11   | 12   | 13   | 14   | 15          | 16   | 17   | 18   | 19   | 20   | 21   | 22     | 23   | 24   | 25   | 26   | 27   | 28   | 29   | 30   | 31   | 32   | 33   | 34   | 35   | 36   | 37   | 38        |
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
| 2730 | 2730 | 18 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | cars: stuff | NULL | NULL | NULL | NULL | NULL | NULL |  5  1  | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | yy        |
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
1 row in set

mysql> (select * from e8 where `15` like '%car%') union
(select * from e10 where `15` like '%car%') union
(select * from e18 where `15` like '%car%') limit 1;");
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
| id   | 1    | 2  | 3    | 4    | 5    | 6    | 7    | 8    | 9    | 10   | 11   | 12   | 13   | 14   | 16   | 17          | 18   | 19   | 20   | 21   | 22   | 23   | 24   | 25     | 26   | 27   | 28   | 29   | 30   | 31   | 32   | 33   | 34   | 35   | 36   | 37   | 38   | 15        |
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
| 2730 | 2730 | 18 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | cars: stuff | NULL | NULL | NULL | NULL | NULL | NULL | NULL |  5  1  | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | yy        |
+------+------+----+------+------+------+------+------+------+------+------+------+------+------+------+------+-------------+------+------+------+------+------+------+------+--------+------+------+------+------+------+------+------+------+------+------+------+------+------+-----------+
1 row in set

Union all和union在这种情况下返回相同的结果。

其中只有一行带有单词部分“car”,它位于表e18中。

出于某种原因,我从使用usion得到的结果中的列名称搞砸了,看起来我错过了什么,有什么想法是什么?

提前致谢。

2 个答案:

答案 0 :(得分:3)

Union按列位置 NOT名称工作。但是您没有指定列位置,因为您执行了*因此它按照数据库选择的顺序排列,但未被您选中。

最终结果集的名称是union中第一个查询中列的名称。

修复很简单:写出您想要的所有列的名称,并确保在所有三个查询之间保持一致。

列不按名称排序(因此重命名列对您没有帮助),订单是数据库中的一些内部订单。

使用*被认为是不好的做法:你不知道你得到了什么,如果你只需要一些列,那么使用*检索更多的数据然后需要,使事情变得更慢。

这样的BTW命名列(按编号)是非常糟糕的编程习惯。世界上你如何保持直线?你的列有数字,你的表有数字。您是否正在尝试编写混淆代码?要确保没有其他人可以处理您的代码?因为如果你这样做,这是一种方法。

答案 1 :(得分:0)

看来,在第一个查询中,您的字段15与其他字段的数字顺序相同。在第二个查询中,它显示在最后。如果你指定你想要的字段(是的,我知道这很多是打字),那么你就不会遇到这个问题。

其次,考虑到返回集中的NULL数以及您使用多个表存储相同类型的数据这一事实,您的数据可能没有很好地规范化。如果将其标准化,您的数据库将更容易使用(以及更快,更高效)。

第三,15 是合理的字段名称 - 特别是当兄弟字段为其他数字命名时。