【问题标题】:MySQL: Duplicate columns having the same name in joinMySQL:连接中具有相同名称的重复列
【发布时间】:2014-09-02 05:49:32
【问题描述】:

关于 SO 的两个问题似乎在询问等效 MySQL 查询的不同行为。在这两种情况下,都会对具有相同列名的表执行连接。 This poster 询问如何从结果中消除具有相同名称的重复列,this poster 询问如何实现结果中具有相同名称的列的重复。

为了测试这一点,我创建了玩具桌:

mysql> describe table_1;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| col_name | varchar(255) | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+

mysql> describe table_2;
+----------+--------------+------+-----+---------+-------+
| Field    | Type         | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| col_name | varchar(255) | YES  |     | NULL    |       |
+----------+--------------+------+-----+---------+-------+

我将值“值”插入到两个表中,并执行了这些连接,其中 JOIN_OP 是“连接”或“左连接”:

mysql> select * from table_1 as t1 JOIN_OP table_2 as t2 on t1.col_name = t2.col_name;
+----------+----------+
| col_name | col_name |
+----------+----------+
| value    | value    |
+----------+----------+

此结果与第一篇文章中的结果一致。这两个查询和两个结果有什么区别?为什么第二张海报没有看到任何重复?

【问题讨论】:

  • 我刚刚重新创建了两个表,以包含 col_name 值的“唯一”约束,并且对于连接和左连接,我得到了相同的结果。你能澄清一下吗?

标签: mysql join left-join


【解决方案1】:

默认情况下,如果您使用*,MySQL 将返回所有表的所有列。返回两列,一列用于 table_1,另一列用于 table_2。您将需要在查询中显式输入列名,以便以您想要的方式检索它们。使用如下查询:

select t1.col_name from table_1 as t1 JOIN_OP table_2 as t2 on t1.col_name = t2.col_name;

【讨论】:

  • 这也删除了重复。但这并没有解释为什么第二张海报没有得到任何重复。
【解决方案2】:

SQL:2003 规则说,如果您使用USING() 连接条件,冗余列将从选择列表中删除,因为很明显这些列具有相同的名称和相同的值。

mysql> select * from table_1 as t1 JOIN table_2 as t2 USING (col_name);
+----------+
| col_name |
+----------+
| value    |
+----------+

而如果您使用更详细的 JOIN ON 语法,并且您使用 select *,则选择列表会从每个连接的表中保留一个单独的列,即使在这种情况下我们可以判断该值是绑定的相同。

但显然 SQL 不够聪明,无法做出这种推断,因为 ON 子句中的条件可能不是相等,例如可能是ON t1.col_name <> t2.col_name,因此这两列都应该保留在选择列表中,因为它们的值不同。

MySQL 5.0.12 及更高版本支持此标准行为(对 MySQL 5.0.12 中的连接语义进行了一些修复,以更加符合标准)。

您可以在此处查看更多讨论:http://bugs.mysql.com/bug.php?id=6489

【讨论】:

  • 这肯定会消除重复。但是,既然第二张海报没有使用这种语法,为什么他/她没有看到任何重复?
  • 该问题中的 OP 说,“当我获取查询结果时”——我猜他们正在获取应用程序中的关联数组,这自然会强制使用相同名称的列合并成一个数组元素,一个覆盖另一个。 SQL 允许结果集有多个具有相同列名的列,但关联数组不允许。
猜你喜欢
  • 2014-08-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-04
  • 2016-10-05
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多