【问题标题】:MySQL Removing duplicate columns on Left Join, 3 tablesMySQL删除左连接上的重复列,3个表
【发布时间】:2012-12-04 04:47:58
【问题描述】:

我有三个表,每个表都有一个外键。当我执行连接时,我得到了重复的列。

给定

mysql> describe Family;
+---------------+-------------+------+-----+---------+-------+
| Field         | Type        | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| HEAD_name     | varchar(45) | NO   | PRI |         |       |
| Family_Size   | int(11)     | NO   |     |         |       |
| Gender        | char(1)     | NO   |     |         |       |
| ID_Number     | int(11)     | NO   |     |         |       |
| DOB           | date        | NO   |     |         |       |
| Supervisor_ID | int(11)     | NO   | MUL |         |       |
+---------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> describe SUPERVISOR;
+-------------------+---------------+------+-----+---------+-------+
| Field             | Type          | Null | Key | Default | Extra |
+-------------------+---------------+------+-----+---------+-------+
| Supervisor_ID     | int(11)       | NO   | PRI |         |       |
| Supervisor_Name   | varchar(45)   | NO   |     |         |       |
| Supervisor_Number | decimal(10,0) | NO   |     |         |       |
| Center_ID         | int(11)       | NO   | MUL |         |       |
+-------------------+---------------+------+-----+---------+-------+
4 rows in set (0.00 sec)

mysql> describe CENTER;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| Center_ID | int(11)     | NO   | PRI |         |       |
| Location  | varchar(45) | NO   |     |         |       |
+-----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

我的查询语句:

SELECT * from Family
   JOIN SUPERVISOR on ( Family.Supervisor_ID = SUPERVISOR.Supervisor_ID)
   JOIN CENTER on (SUPERVISOR.Center_ID = CENTER.Center_ID); 

我的目标是从连接中获取所有列中的一行,而没有重复的列。 那么我应该使用什么样的 SQL 语句语法呢?

【问题讨论】:

    标签: mysql database join mysql-workbench


    【解决方案1】:

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

    SELECT A.HEAD_name, A.Family_Size, A.Gender, A.ID_Number, A.DOB,
        B.Supervisor_ID, B.Supervisor_Name, B.Supervisor_Number,
        C.Center_ID, C.Location
    FROM Family A
    JOIN SUPERVISOR B on ( A.Supervisor_ID = B.Supervisor_ID)
    JOIN CENTER C on (B.Center_ID = C.Center_ID);
    

    【讨论】:

    • 如果你觉得懒惰,你可以从最大的表中取出所有列(在本例中为 A),然后添加你想要的任何剩余的列:A.*, B.Supervisor_Name, B.Supervisor_Number, B.*。跨度>
    • @paddy 当然可以!但是如果你想优化你的查询永远不要使用*。它为表列名称添加了额外的查找。在一个小查询中,这可能无关紧要,但从长远来看,它可以为多个查询加起来。
    • 酷,很高兴知道。我从不这样做,除非我只是在做一次性查询。
    【解决方案2】:

    这个问题可以通过“USING”关键字来解决。

    SELECT * from Family
       JOIN SUPERVISOR on ( Family.Supervisor_ID = SUPERVISOR.Supervisor_ID)
       JOIN CENTER on (SUPERVISOR.Center_ID = CENTER.Center_ID); 
    

    在您的情况下,查询将变为

    SELECT * FROM FAMILY 
      JOIN (SUPERVISOR JOIN CENTER USING(Center_ID)) USING(Supervisor_ID);
    

    重点很简单, 如果您有两个表 A(a,b) 和 B(b,c),那么在加入后以 (a,b,c) 的形式产生结果

    Select *
        from A JOIN B USING(b);
    

    将给出三列的结果集(a,b,c)

    注意:由于我不知道是否可以在 Using 中使用多个参数,因此我将其作为子查询。

    【讨论】:

      【解决方案3】:

      您没有得到重复的列,您真正得到的是表 Family(即 Family.Supervisor_ID)中的 Supervisor_ID 列和表 Supervisor(即 Supervisor.Supervisor_ID)中的 Supervisor_ID,但对于您的结果集,您会看到都作为 Supervisor_ID,这就是为什么您认为它们是重复的。 Center_iD 也会发生同样的情况。

      解决方案是从每个表中指定你需要的字段,并决定是否需要获取 Supervisor_ID 和 Center_ID 以及从哪个表获取。

      【讨论】:

        【解决方案4】:

        根据奥利利的说法,

        寻找一个解释计划
        你可以做一个 _select x from y inner join.... where w=z ...这只是一个例子

        【讨论】:

          猜你喜欢
          • 2014-02-04
          • 2017-07-02
          • 2021-03-20
          • 2016-08-31
          • 1970-01-01
          • 1970-01-01
          • 2015-03-15
          • 2011-12-22
          • 1970-01-01
          相关资源
          最近更新 更多