2009-10-21 4 views
0

나는 앨범 테이블과 앨범 허가 테이블을 가지고있다.약간의 복잡한 SQL

앨범 는 개인 (값 예 또는 아니오)

앨범 권한 이 이

**albums** 
album_id name private 
1  family  yes 
2  friend  no 
3  outdoor pic yes 

**album permission** 
id  album_id user_id 
1  3   5 

지금은 모든 앨범 목록을 얻으려면을 USER_ID album_id 아이디, 이름을 album_id 나는 허락을 받았다. 즉, album.private = no 또는 내 ID (5)가 권한 테이블에있는 경우 행이 목록에 있어야합니다. 그렇지 않으면 목록에 표시되어서는 안됩니다.

결과에서 저를 표시해야합니다 다음

**albums result set** 
    album_id name private 
    2  friend  no 
    3  outdoor pic yes -- < this showing me, because i exist in the permission table 

답변

2
select * from **albums** a 
where a.private = 'no' 
or exists (
    select 1 from **album permission** p 
    where p.album_id = a.album_id 
    and p.user_id = 5 
) 
+0

나는 당신의 더 나은, 더 쉬운 읽고 싶은 생각합니다. –

+0

예, 동의합니다. 읽기 쉽습니다. – Basit

+0

대단히 감사합니다 = D – Dave

3

트릭은 모든 앨범을 선택하고 그와 관련된 권한 기록이있는 경우, 그 기록이 선택됩니다 의미 앨범 권한에 가입 왼쪽에 너무.

그런 다음 앨범이 비공개가 아니어야하거나 권한 레코드가 있어야한다고 지정하는 where 절을 추가하십시오.

SELECT Albums.Album_ID, Albums.Name, Albums.Private 
FROM Albums 
LEFT JOIN AlbumPermissions ON Albums.Album_ID = AlbumPermissions.Album_ID 
           AND AlbumPermissions.User_ID = 5 
WHERE 
    Albmums.private == 'no' 
    OR AlbumPermissions.ID IS NOT NULL 
1

사용 UNION :

SELECT a.album_id, 
     a.name, 
     a.private 
    FROM ALBUMS a 
WHERE a.private = 'no' 
UNION ALL 
SELECT a.album_id, 
     a.name, 
     a.private 
    FROM ALBUMS a 
    JOIN ALBUM_PERMISSION ap ON ap.album_id = a.album_id 
WHERE ap.user_id = 5