2017-04-10 2 views
0

이 내 쿼리입니다 : enter image description here 결과는 5 행이지만, directory_relations 6 기록이다 :SQL이 왼쪽 첫 번째 테이블의 데이터 만 결과 조인

select dr.*, v.hash, d.* from directory d 
left join directory_relations dr on d.id = dr.directory_id 
left join videos v on dr.video_id = v.id 

이 결과입니다. 테이블 : directory_relations enter image description here

표 : 디렉토리

enter image description here

룩 좋아하는 비디오에 대한 데이터를 놓친다. 하지만 ID가 14059 인 VIDEO 테이블 행에 존재하는 이유를 모르겠습니다.

+1

'id'가 9 인 행이 없습니다. –

+0

비디오 테이블을 표시 할 수 있습니까 – Jenish

+0

디렉토리가 부모 테이블 인 경우 디렉토리가없는 디렉토리 레코드에 하위 레코드가 없어야합니다 디렉토리 레코드. 데이터 모델이 엉망으로 보이고 데이터 무결성 문제가 있습니다. directory_relations가 부모 테이블 인 경우 조인이 잘못되어 왼쪽 조인 디렉토리의 왼쪽 조인 비디오와 디렉토리 관계에 조인해야합니다. – HLGEM

답변

0

첫 번째 left joindirectory_relations의 테이블이 아닌 directory 테이블의 모든 행을 유지합니다. 둘 다 보존하려면 대신 full outer join이 필요하지만 MySQL은 해당 작업을 지원하지 않습니다. 를 모방하기 위해 당신은 당신의 당신은 LEFT가 왼쪽 테이블에서 모든 행을 반환합니다 가입 사용하는

select t1.*, v.hash 
from (
      select dr.*, d.id as d_id, d.name, d.user_id 
      from directory d 
      left join 
        directory_relations dr 
      on  d.id = dr.directory_id 
      union 
      select dr.*, d.id as d_id, d.name, d.user_id 
      from directory_relations dr 
      left join 
        directory d 
      on  d.id = dr.directory_id 
     ) t1 
left join 
     videos v 
on  t1.video_id = v.id 
+0

SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 매뉴얼을 확인하여 '전체 외부 조인'을 사용하십시오. directory_relations dr on d.id = dr.directory_id – Jensej

+0

MySQL이 전체 외부 조인을 지원하지 않는다고 생각하지 않았습니다. . 이제는 작동해야합니다 –

+0

중복 된 컬럼 이름 'id' – Jensej

0

같은 쿼리와 일치하는이 오른쪽 테이블의 모든 행을 작성할 수 있습니다. 그래서 ID = 9가 반환되지 않습니다 : 오른쪽 테이블에 있기 때문에 왼쪽 테이블에 ID = 0 인 디렉토리가 없습니다.

테이블의 순서를 전환하거나 디렉토리 테이블에 ID = 0 인 디렉토리를 추가 할 수 있지만 데이터베이스의 논리에 따라 더 나은 해결책이 될 수 있습니다.

관련 문제