2016-12-16 94 views
-2

我正在使用MySQL將兩個不同的表連接在一起。 peoplehomes爲什麼SELECT * FROM table INNER JOIN..ON顯示相交列兩次?

當我嘗試內加入這兩個與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顯示一次,導致addressON被顯示兩次?

+0

可能重複[MySQL ON vs USING?](http://stackoverflow.com/questions/11366006/mysql-on-vs-using)...它沒有深刻的解釋爲什麼,但我認爲它只是爲了讓事情變得更簡單,因爲USING無論如何都是語法糖 – dan08

+0

它不是重複的。這就要求MySQL ON與使用之間的通用差異。我要問一個爲什麼兩個輸出不同結果的具體實例。雖然第一個答案指出select * FROM INNER JOIN ON會導致列出兩次,但並不能解釋原因。 – the12

+0

真的嗎?你讀過羅伯特羅查的回答,那對你不滿意? – dan08

回答

1

當您使用ON people.address = home.address時,只是巧合的是兩個表中的列名相同 - 通常這種類型的ON條件與具有不同名稱的列匹配。當你這樣做時,重複列不會被過濾掉。

但是當您使用USING (address)時,兩個表中的列名必須相同(因爲USING不允許您將不同名稱的列關聯起來)。由於它們兩者顯然是多餘的,所以重複項被過濾掉。

1

請參閱MySQL Join Syntax,尤其是在「在MySQL 5.0.12中加入處理更改」部分。 USING或NATURAL JOIN始終將連接屬性視爲相同,以使其中一個是多餘的。與以前的行爲不同,由於5.0.12'冗餘列被刪除,並且列順序根據標準SQL正確「。

-5

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

嘗試在你的模型中使用它。

public function getAdd(){ $ this-> db-> select('p.first_name','p.last_name',a.address as add'); $ this-> db-> join('homes a',a.address = p.address'); $ query = $ this-> db-> get('people p'); $ query-> return - > result_array(); }

+1

您是否發佈錯誤的問題? –

+0

和foreach它在您的視圖 foreach(地址添加): <?php echo ['address']; ?> –

+1

這不是這個問題的答案 –

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不支持,但。

相關問題