2009-10-21 2 views
0

У меня есть таблица стола альбома и альбом.маленький комплекс sql

альбома album_id имени частных (значений да или нет)

альбома разрешения ID album_id user_id

**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 

теперь я хочу, чтобы получить весь список альбомов, с которым я получил разрешение. это означает, что если album.private = no или если мой идентификатор (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 
Смежные вопросы