2012-11-29 70 views
1

我有下面的MySQL查詢:MySQL的自然連接顯示類似於LEFT OUTER結果JOIN

SELECT * FROM `objects` 
natural join `gPeople` 
natural join `gVip` 
natural join `gTeachers` 

將返回:

object_id  name   vip_code   subject 
---------------------------------------------------------- 
003    John   9003    Math 

這是因爲 '約翰' 是在羣體的人,貴賓和教師。

我有其他人在短短的兩個組,並希望他們表現出像:

object_id  name   vip_code   subject 
---------------------------------------------------------- 
001    Mary        History 
002    Holly   9002    
003    John   9003    Math 

我已經試過左外連接,但我最終這是不是由於所需objects_id列的多個副本我使用結果的方式。

注:我必須使用*,因爲它是我正在嘗試做的核心。我需要這些表能夠支持添加/刪除列以及查詢能夠提取它們。

http://sqlfiddle.com/#!2/eefe7/3/0這是什麼,我已經試過SQL小提琴但是我的結果是這樣的:

object_id object_id name  object_id vip_code  object_id subject 
------------------------------------------------------------------------------ 
001   001   Mary        001   History 
002   002   Holly  002   9002        
003   003   John  003   9003   003   Math 

任何人都知道一個辦法做到這一點?

+0

[你有什麼嘗試?](http://www.whathaveyoutried.com/) –

+0

Quote:「我試過左外連接」 – Craig

+1

更好的迴應本來是要張貼一些代碼 –

回答

0

我能夠通過在PHP中編輯結果來解決我的問題。

$sql = "SELECT `o`.`object_id` AS `ID`, `gP`.*, `gV`.*, `gT`.* FROM `objects` `o` 
left outer join `gPeople` `gP` ON `o`.`object_id` = `gP`.`object_id` 
left outer join `gVip` `gV` ON `o`.`object_id` = `gV`.`object_id` 
left outer join `gTeachers` `gT` ON `o`.`object_id` = `gT`.`object_id`"; 

$result = mysql_query($sql); 

while ($row = mysql_fetch_object($result)) { 
    $row->object_id = $row->ID; 
    unset($row->ID); 
} 

這導致:

object_id  name   vip_code   subject 
---------------------------------------------------------- 
001    Mary        History 
002    Holly   9002    
003    John   9003    Math 

相反的:

object_id  name   vip_code   subject 
---------------------------------------------------------- 
001    Mary        History 
       Holly   9002    
003    John   9003    Math 

看來,這是因爲在表gSubject沒有OBJECT_ID爲對象002它將覆蓋OBJECT_ID的結果用空值。

ie對於第一遍(對象表)上的對象002,它等於002,然後在第二遍(gPeople表)上再次用002覆蓋它,然後在第三遍(gVip表)上再次用002覆蓋它,然後在最後一遍(gTeachers表)中,它被覆蓋爲null,因爲表中沒有記錄。