2

使用联合时我得到错误的列名。

这就是我所做的,我有两个结构相同但记录不同的非常大的表,所以就在这里。

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

在这种情况下,联合所有和联合返回相同的结果。

其中只有一行带有单词“car”,它在表 e18 中。

出于某种原因,我使用 usion 得到的列名被弄乱了,看起来我错过了一些东西,有什么想法吗?

提前致谢。

4

2 回答 2

4

联合按列位置而不是名称工作。但是您没有指定列位置,因为您这样*做是按照数据库选择的某种顺序,但不是您选择的。

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

解决方法很简单:写下您想要的所有列的名称,并确保所有三个查询之间的顺序保持一致。

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

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

顺便说一句,像这样(按数字)命名列是非常糟糕的编程实践。你到底是如何保持直截了当的?你的列有数字,你的表格有数字。您是否正在尝试编写混淆代码?确保没有其他人可以处理您的代码?因为如果你是,这是一种方法。

于 2012-08-13T14:15:19.867 回答
0

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

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

第三,15不是一个合理的字段名称——尤其是当兄弟字段以其他数字命名时。

于 2012-07-30T13:13:07.950 回答