2012-07-30 77 views
2

使用union时出现错误的列名。mysql 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在这种情况下返回相同的结果。

它只有一行字部分“汽车”在它,它是在表e18。

出于某种原因,结果是我使用得延髓都搞砸了,看起来像我失去了一些东西,任何想法是什么列名?

在此先感谢。

+0

你是什么意思'搞砸了'? – Vatev 2012-07-30 01:56:30

+0

没有足够的细节来解释情况。使用另一个名称,但要小心,不要太抽象 – 2012-07-30 01:57:14

+2

向我们展示您的表格模式 – Jocelyn 2012-07-30 01:57:15

回答

3

联盟作品按列排名不是名称。但是您没有指定列位置,因为您的确是*,所以它按照某种顺序由数据库选择,但不是由您挑选。

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

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

的列不上名字的排序(所以重命名列不会帮你),顺序是数据库中的某些内部订单。

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

顺便说一句这样的命名列(按编号)是很差的编程习惯。你在世界上如何保持直线?你的列有数字,你的表有数字。你是否试图编写混淆代码?为了确保没有人能够处理你的代码?因为如果你是,这是一个方法来做到这一点。

+0

这并不像听起来那么容易,我现在有超过60列,不,我不试图混淆任何东西x)它只是自动生成这些表,并且这些数据不应该直接存储或请求。 – 2012-08-13 16:00:04

+0

@RaslyWalker即使你正在自动生成表格,你仍然应该给正常的名字。 60列?你在储存什么?而且你也有很多NULLS--我强烈怀疑表格设计不正确,应该将它们归一化并分解。 – Ariel 2012-08-13 17:48:22

0

看起来在第一个查询中,您的字段15与其他字段按数字顺序排列。在第二个查询中,它显示在最后。如果你指定了你想要的字段(是的,我知道这是很多输入),那么你不会有这个问题。其次,考虑到返回集中的NULL数量以及您使用多个表来存储相同类型数据的事实,您的数据可能没有很好地标准化。如果你规范化数据库,你的数据库会更容易使用(以及更快,更高效)。

第三,15而不是一个合理的字段名 - 尤其是当兄弟字段被命名为其他数字时。

+0

谢谢,你认为我可以通过重命名像c15 c16 c17 ...这样的列来修复它吗? – 2012-07-30 22:22:55

+0

@RaslyWalker:它可能工作。我不相信SQL需要以特定顺序输出列,除非在查询中定义了该顺序。我想知道的是,列名的通用性如何,就是你存储的内容。所有列都保存相同类型的数据吗?即,您是否像使用电子表格或矩阵那样使用数据库表格而不是关系表格?如果你是,你最好的选择是重新考虑你的表格结构。列应该容易分类的数据,应该很容易用一个描述性的名字命名。当他们不这样做时,这是可能出现问题的症状。 – dnagirl 2012-08-04 22:10:50

+0

我不认为这将有助于反正,但我猜他们是或多或少像表一样的关系,大多数列拥有非常相似的数据,如字符串和数字,但列不是100%定义,可能会改变,所以我不能给他们描述性的名字。另外我不会自己命名它们,这些表格是自动创建的。 – 2012-08-05 01:29:08