2012-11-01 3 views
2

세 번째 테이블이 다른 두 테이블을 조인 할 쿼리를 작성하려고합니다. 문제는이 첫 번째 테이블의 다른 버전이 있기 때문에 테이블 1의 열을보고 조인 할 올바른 테이블을 선택하는 쿼리가 필요하지만 결과 쿼리는 테이블 1의 모든 행을 반환해야합니다. WHERE 절을 만나는 특정 행 이것도 가능합니까?첫 번째 테이블의 내용을 기반으로 테이블에 가입하십시오.

예 :

표 1 = 사용자

표 2 = 배너

표 3 =의 UserSettings 또는 AdminSettings 또는 아무것도

쿼리는 말할 것 ...

WHERE User.rank='admin' LEFT JOIN AdminSettings 

WHERE User.rank='user' LEFT JOIN UserSettings 

나의 현재 쿼리는 이것이다 :

$query = "SELECT * FROM Users as U WHERE U.user_id = :id "; 
$query .= "LEFT JOIN Banners as B ON U.banner_id = B.banner_id "; 
$query .= "LEFT JOIN AdminSettings ON U.server_id = AdminSettings.user_id WHERE U.rank='Admin' "; 
$query .= "LIMIT 1"; 

문제는 단지 User.rank = '관리자'를이 행을 보여주고 User.rank = '사용자의 나머지 행을 표시하지 않는다는 것입니다.

답변

2

필드 목록에서 IF 절을 사용하십시오, 내 CASE를 사용 : 그런

$query = "SELECT field1, field2, field3, IF(User.rank = 'admin', A.field, B.field)"; 
$query .= " FROM Users as U"; 
$query .= " LEFT JOIN Banners as B ON U.banner_id = B.banner_id"; 
$query .= " LEFT JOIN AdminSettings as A ON U.server_id = A.user_id"; 
$query .= " LIMIT 1"; 

뭔가 트릭을 할해야합니다.

3

table3을 두 번 가입하고 select 문이 같은

SELECT a.*, 
     b.* 
     CASE WHEN a.rank = 'admin' 
      THEN c.user_ID      -- gets value from AdminSettings 
      ELSE d.user_ID      -- gets value from UserSettings 
     END as ColName1, 
     CASE WHEN a.rank = 'admin' 
      THEN c.colName      -- gets value from AdminSettings 
      ELSE d.colName      -- gets value from UserSettings 
     END as ColName2 
FROM users a 
     INNER JOIN banners b 
      ON a.banner_id = b.banner_id 
     LEFT JOIN AdminSettings c 
      ON a.server_ID = c.user_ID 
     LEFT JOIN UserSettings d 
      ON a.server_ID = d.user_ID 
관련 문제