2016-10-01 4 views
0

내가 소유하고있는 모든 문서에 대한 행을 포함하는 Document라는 db 테이블이 있다고 가정 해 보겠습니다. 나는 특정 user_id가 접근 할 수있는 (다른 사람들이 소유 한) 문서에 대한 레코드를 가진 Shared라는 또 다른 db 테이블을 가지고있다. 예를 들어 user1 인 경우, 내 user_id 및 user2의 document_ids와 공유 테이블에 저장된 액세스 권한이있는 Documents2 및 Documents2 문서에 내 문서가 있습니다.Combining 결과에 따라 테이블 선택

Document 
id 
user_id 
type 
name 
permissions 

Shared 
id 
document_id 
used_id 
permissions 

Documents 테이블의 각 항목에는 permissions = "all"이 있습니다. 공유 테이블의 각 항목에는 {write, read, delete}와 같은 사용 권한 수준이 있습니다. 사용자의 foo가 소유하거나 액세스 할 수있는 모든 문서를 다시 가져 오는 쿼리에서 필자는 문서 또는 공유의 레코드인지에 따라 적절한 사용 권한을 얻고 싶습니다. 나는 이제 자신의 모든 문서를 가져 와서 액세스 할 수있는 기본 쿼리를 가지고 있습니다.

Select d.id, d.user_id, d.permissions 
from Document d 
    left join Shared s on s.document_id = d.id 
where s.user_id = 1 

또 다른 시도가 :

Select d.id, d.user_id, 
     COALESCE(s.permissions, d.permissions) as permissions 
from Documents d 
    left join Shared s on s.document_id = d.id and s.user_id = 1; 
+0

가 ID입니다 내 시도는이 같은 것입니다 공유 테이블에 서로 게이트 키가 있습니까? – Mackers

+0

공유 테이블의 id는 문서 또는 사용자 테이블과 아무 관련이 없습니다. 간단한 자동 증가 기본 키 –

+0

귀하의 질문에 귀하의 질문을 추가하고 해당 데이터를 기반으로 예상되는 출력을 추가하십시오. [_Formatted_] (http://stackoverflow.com/editing-help#code) ** text ** please, [스크린 샷 없음] (http://meta.stackoverflow.com/questions/285551/why-may-i) 285557 # 285557) –

답변

1

내가 제대로 이해한다면, 당신은 단지 노동 조합에 각 테이블의 결과를 필요 믿습니다

select * from 
    (select d.id as document_id, d.user_id, 'all' as permissions, d.name 
    from t_documents d 
    union all 
    select s.document_id, s.user_id, s.permissions, dtl.name 
    from t_shared s 
    left join t_documents dtl 
    on s.document_id = dtl.id) tot 
where tot.user_id = 1; 
+0

은 다음보다 성능이 좋을까요? : d.id, d.user_id, COALESCE (이미지를 업로드하지 않고 이미지를 업로드하지 마십시오. s.permissions, d.permissions) 문서 d의 권한을 s.document_id = d.id 및 s.user_id = 1에 공유에 남겼습니다. –

+0

설명이 주어지면 테이블은 상호 배타적입니다. 문서 테이블에는 문서 소유자의 사용 권한이 있고 공유 테이블에는 문서 당 소유자 이외의 다른 사용자에 대한 사용 권한이 있습니다. 두 테이블 모두에서 동일한 사용자/문서 조합에 대한 레코드를 가지지 않기 때문에 여기서는 조인을 사용하지 않을 것입니다. 노동 조합은이 상호 배타의 결과입니다. – Mackers

+0

나는 본다. 성능면에서 노조는 조인보다 효율적인 질의를 생성합니까? 또한, 귀하의 대답은 지금은 user_id에 의해 쿼리하지 않기 때문에 당신의 대답은 꽤 작동 믿습니다 –

관련 문제