我使用MySQL将两个不同的表连接在一起。 people
和homes
。
当我尝试使用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
显示两次?
答案 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(); }