为什么SELECT * FROM表INNER JOIN..ON显示交叉列两次?

时间:2016-12-16 22:29:34

标签: mysql sql

我使用MySQL将两个不同的表连接在一起。 peoplehomes

当我尝试使用USING关键字将两者连接在一起时,它会为我想要加入的交叉列(地址)返回一列:

SELECT * FROM people INNER JOIN homes USING(address);

+---------------------+------------+-----------+----------+
| address             | first_name | last_name | city     |
+---------------------+------------+-----------+----------+
| 533 Dufferin Street | Joe        | Smith     | Toronto  |
| 421 Yonge Street    | John       | Schmidt   | New York |
| 90 Bayview Avenue   | Mary       | Poppins   | Chicago  |
| 800 Keele Street    | Joe        | Dirt      | L.A      |
+---------------------+------------+-----------+----------+

然而,当您使用ON关键字内部加入两个表时,它会为address(相交列)返回两列。

SELECT * from people INNER JOIN homes ON(people.address = homes.address);

+------------+-----------+---------------------+---------------------+----------+
| first_name | last_name | address             | address             | city     |
+------------+-----------+---------------------+---------------------+----------+
| Joe        | Smith     | 533 Dufferin Street | 533 Dufferin Street | Toronto  |
| John       | Schmidt   | 421 Yonge Street    | 421 Yonge Street    | New York |
| Mary       | Poppins   | 90 Bayview Avenue   | 90 Bayview Avenue   | Chicago  |
| Joe        | Dirt      | 800 Keele Street    | 800 Keele Street    | L.A      |
+------------+-----------+---------------------+---------------------+----------+

所以我想总结一下,为什么USING会导致列address显示一次,而ON会导致address显示两次?

4 个答案:

答案 0 :(得分:2)

当您使用ON people.address = home.address时,两个表中的列名相同只是巧合 - 通常这种类型的ON条件匹配具有不同名称的列。执行此操作时,不会从结果中过滤掉重复的列。

但是当您使用USING (address)时,两个表中的列名必须相同(因为USING不允许您将具有不同名称的列关联起来)。由于同时使用它们显然是多余的,因此过滤掉了重复项。

答案 1 :(得分:1)

请参阅MySQL Join Syntax,尤其是在MySQL 5.0.12'中的加入处理更改部分。 USING或NATURAL JOIN始终将join属性视为相同,使得其中一个属性是冗余的。与以前的行为不同,自5.0.12以来,根据标准SQL'消除了冗余列,列顺序正确。

答案 2 :(得分:1)

在此查询中

SELECT * from people INNER JOIN homes ON(people.address = homes.address);

结果中有两个地址,即people.address和homes.address。在内连接的情况下,两者具有相同的值。如果是另一种连接类型(外部或交叉连接),他们就不会这样做。

在另一个查询中

SELECT * FROM people INNER JOIN homes USING(address);

将两者合并为一个不合格的地址。你得到的是连接标准更容易编写(但是当你需要一个限定符然后再次返回ON时会出现更复杂的查询)。

USING对多个完整外连接*特别有用*:

select col, a.colx, b.coly, c.colz
from a
full outer join b using (col)
full outer join c using (col);

select coalesce(a.col,b.col,c.col) as col, a.colx, b.coly, c.colz
from a
full outer join b on b.col = a.col
full outer join c on c.col = coalesce(a.col,b.col);

*)但MySQL不支持全外连接。

答案 3 :(得分:-5)

在您的控制器中         $ data ['address'] = $ this-> yourmodel-> getAdd();

尝试在模型中使用它。

public function getAdd(){          $这 - > DB-> select('p.first_name','p.last_name',a.address as add');          $ this-> db-> join('homes a',a.address = p.address');          $ query = $ this-> db->得到('人民p');          $查询 - > return - > result_array(); }