使用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得到的结果中的列名称搞砸了,看起来我错过了什么,有什么想法是什么?
提前致谢。
答案 0 :(得分:3)
Union按列位置 NOT名称工作。但是您没有指定列位置,因为您执行了*
因此它按照数据库选择的顺序排列,但未被您选中。
最终结果集的名称是union中第一个查询中列的名称。
修复很简单:写出您想要的所有列的名称,并确保在所有三个查询之间保持一致。
列不按名称排序(因此重命名列对您没有帮助),订单是数据库中的一些内部订单。
使用*
被认为是不好的做法:你不知道你得到了什么,如果你只需要一些列,那么使用*
检索更多的数据然后需要,使事情变得更慢。
答案 1 :(得分:0)
看来,在第一个查询中,您的字段15
与其他字段的数字顺序相同。在第二个查询中,它显示在最后。如果你指定你想要的字段(是的,我知道这很多是打字),那么你就不会遇到这个问题。
其次,考虑到返回集中的NULL数以及您使用多个表存储相同类型的数据这一事实,您的数据可能没有很好地规范化。如果将其标准化,您的数据库将更容易使用(以及更快,更高效)。
第三,15
不是合理的字段名称 - 特别是当兄弟字段为其他数字命名时。