我有三个表,每个表都有一个外键。当我执行连接时,我会得到重复的列。
鉴于
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语句?
答案 0 :(得分:13)
默认情况下,如果您使用*
,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);
答案 1 :(得分:6)
问题可以通过“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);
将为Result-Set提供三列(a,b,c)
注意:由于我不知道我们是否可以在使用中使用多个参数,因此我将其作为子查询。
答案 2 :(得分:1)
你没有获得重复的列,你真正得到的是表Family的Supervisor_ID列(即Family.Supervisor_ID)和表Supervisor的Supervisor_ID(即Supervisor.Supervisor_ID),但对于你的结果集,你会看到作为Supervisor_ID,这就是为什么你认为它们是重复的。 Center_iD也会发生同样的情况。
解决方案是从每个表中指定所需的字段,并决定是否需要获取Supervisor_ID和Center_ID以及从哪个表中获取它。
答案 3 :(得分:0)
据oreilly说,
寻找解释计划 你可以从y inner join做一个_select x,其中w = z ......这只是一个例子