2009-10-21 8 views
0

J'ai table d'album et table d'autorisation d'album.petit complexe sql

album album_id nom privé (valeurs oui ou non)

album permission 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 

maintenant je veux obtenir toute la liste des albums, dont j'ai la permission de. ce qui signifie que si album.private = no ou si mon identifiant (5) existe dans la table des permissions, alors la ligne devrait être dans la liste, sinon elle ne devrait pas apparaître dans la liste.

suivant devrait me montrer dans le résultat

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

Répondre

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

Je pense que j'aime votre est mieux, il est plus facile à lire. –

+0

ya je suis d'accord, c'est plus facile à lire. – Basit

+0

merci beaucoup = D – Dave

3

L'astuce est de jointure gauche sur les autorisations d'album qui signifie que chaque album sera sélectionné et s'il y a un dossier d'autorisation qui lui est associé, cet enregistrement sera sélectionné aussi. Ensuite, ajoutez simplement une clause where indiquant que l'album ne doit pas être privé ou qu'un enregistrement d'autorisation doit exister.

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

En utilisant 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