2012-11-29 2 views
1

나는 다음과 MySQL의 쿼리가 :MySQL의 자연은 LEFT OUTER와 유사한 결과를 가입 보여 가입

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

반환

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

'존'이 그룹 사람들에 있기 때문입니다, Vip and Teachers.

난 그냥 두 그룹으로 다른 사람들이 있고 그들처럼 보여 드리고자 : 나는 시도

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

왼쪽 외부 조인하지만 난으로 인해 원하는되지 않은 objects_id 컬럼의 매수와 끝까지 내가 결과를 사용하는 방식.

참고 : * 내가해야하는 일의 핵심이므로 *를 사용해야합니다. 내가 추가/제거되고 쿼리를 데리러 수있는 열을 지원할 수있는 테이블이 필요합니다.

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 

사람이 할 수있는 방법을 알고

http://sqlfiddle.com/#!2/eefe7/3/0이 내가 시도 것의 SQL 바이올린 그러나 나의 결과는 다음과 같습니다입니까?

+0

은 (http://www.whathaveyoutried.com/는) –

+0

인용구 : – 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 

객체 002에 대한 테이블 gSubject에는 OBJECT_ID가 없기 때문에이 결과에 OBJECT_ID를 덮어 보인다 Null 값.

예 : 첫 번째 패스 (objects 테이블)의 개체 002의 경우 002와 같고 두 번째 패스 (gPeople 테이블)에서는 002로 다시 덮어 쓰고 세 번째 패스 (gVip 테이블)에서는 다시 002로 덮어 씁니다. 마지막 패스 (gTeachers 테이블)에서는 테이블에 레코드가 없으므로 null로 겹쳐 쓰여집니다. [당신이 시도 무엇?]