2011-02-07 4 views
1

table1 (ID는 항상 있음)하나의 테이블에 DATA가없는 경우 3 개의 테이블, 왼쪽 조인

+----+------+ 
| id | col1 | 
+----+------+ 
| 1 | ab | 
+----+------+ 
| 2 | gh | 
+----+------+ 

table2 (항상 존재)

+----+------+ 
| id | col2 | 
+----+------+ 
| 1 | cd | 
+----+------+ 
| 2 | ij | 
+----+------+ 

table3 (이 경우 2이 누락 될 수 있음)

+----+------+ 
| id | col3 | 
+----+------+ 
| 1 | ef | 
+----+------+ 

PHP

$col = 'ab'; 

$a = mysql_query("SELECT t1.id FROM table1 AS t1, table2 AS t2, table3 AS t3 
WHERE t1.id = t2.id AND t2.id = t3.id AND (t1.col1 = '$col' OR t2.col2 = '$col' 
OR t3.col3 = '$col) GROUP BY t1.id, t2.id, t3.id"); 

세 개의 테이블 모두 "같은 ID"가 포함 된 경우에만 작동하지만, 어떤 이유로 든 "id"가 table3에없는 경우 어떻게됩니까? $ col = ab 일 때, 3 개의 테이블을 모두 테스트하고 t1.id를 1로 출력하려면 어떻게해야합니까? 을 사용하여 왼쪽에 가입해야합니까?

$a = mysql_query("SELECT t1.id FROM table1 AS t1, table2 AS t2 
LEFT JOIN (SELECT id FROM table3 WHERE col3 = '$col') AS t3 ON t3.id = t1.id 
WHERE t1.id = t2.id AND (t1.col1 = '$col' OR t2.col2 = '$col') 
GROUP BY t1.id, t2.id"); 

내가 뭘 잘못하고 있니?

+0

컨텍스트가 없으면 달성하고자하는 것을 이해하기가 어렵습니다. 검색 할 데이터와 테이블 간의 상관 관계는 무엇입니까? – jishi

답변

1

뭐 잘못하셨습니까? 존재하지 않는 테이블을 쿼리합니다. 항상 오류가 발생합니다.

쿼리에 중요한 테이블을 만들고 이동하는 데이터베이스 설계의 지혜를 언급하지 않을 것입니다. 클라이언트 측에서

귀하의 유일한 희망은

  • 관심있는 테이블의 존재에 대한 테스트 및
  • 그 결과에 따라 서로 다른 SQL 문 을 실행하는 것입니다. 당신은 하나 개 또는 두 개의 왼쪽 외부 중 하나가 조인 필요 같은 [편집 한 후]


소리가 난다. 이것은 table3에 있는지 여부에 관계없이 table1과 table2에 공통 인 모든 ID를 제공합니다.

select t1.id, t2.id, t3.id 
from table1 t1 
inner join table2 t2 on (t1.id = t2.id) 
left join table3 t3 on (t1.id = t3.id); 

그리고이 관계없이, 물론 당신이 결과를 필터링 할 수 있습니다, 표 2 또는 표 3

select t1.id, t2.id, t3.id 
from table1 t1 
left join table2 t2 on (t1.id = t2.id) 
left join table3 t3 on (t1.id = t3.id); 

에있어 그리고 여부 당신에게 표에있는 모든 ID를 제공하여 WHERE 절.

+0

오케이, 그게 혼란을 일으킬 거라는 것을 알았어. 그래서 내가 그 글을 업데이트 한거야. 테이블은 항상 존재하지만 특정 "ID"는 포함하지 않습니다.) –

0

LEFT JOIN은 테이블에 존재하지만 데이터가없는 경우에만 작동합니다.

Catcall suggested과 같은 작업을하고 싶지 않다면 (테이블이 있는지 확인하고이를 기반으로 다른 SQL 문을 사용하십시오 ...) 테이블에 데이터베이스가 있는지 확인해야합니다 완전히 비어 있으면.

보통 상황에서는 응용 프로그램의 데이터베이스를 어느 정도 제어해야하므로 테이블이 실제로 있는지 확인할 수 있어야합니다.

누군가가 테이블을 삭제했는지 확신 할 수없는 등 큰 문제인 경우 테이블을 만들 때마다이를 확인할 수 있습니다. 존재하지 않는 경우 테이블을 만듭니다.

관련 문제