2009-07-23 13 views
1

que j'ai une table qui contient le contenu:contenu paramètre pour être visible par des amis que

Contenu (contentID, titre, corps, privacyType)

type de confidentialité peut être:

public = 1 (tout le monde peut la voir) Private = 2 (seul l'auteur peut la voir) amis = 3 (seuls les amis peuvent voir)

J'ai une table d'utilisateurs:

utilisateurs (ID utilisateur, nom d'utilisateur)

, j'ai une table de correspondance pour les utilisateurs amis:

Amis (userID, friendID)

Maintenant, quand je suis annonce tout le contenu, il devrait la liste contenu qui est soit public OU je suis un ami de cet utilisateur (pour un utilisateur connecté)

Comment faire une requête pour cela?

Répondre

4

Vous n'avez pas fourni le domaine où la paternité de contenu est stocké, donc je vais supposer qu'il est content.author:

SELECT * 
FROM content 
WHERE public = 1 
     OR 
     (
     public = 3 
     AND EXISTS 
     (
     SELECT NULL 
     FROM friends 
     WHERE userId = @me 
       AND friendID = content.author 
     ) 
     ) 

, ou mieux ceci:

SELECT * 
FROM content 
WHERE public = 1 
UNION ALL 
SELECT * 
FROM content 
WHERE public = 3 
     AND EXISTS 
     (
     SELECT NULL 
     FROM friends 
     WHERE userId = @me 
       AND friendID = content.author 
     ) 

, si votre champ author est sélectif et le tri est moins cher que le filtrage.

Notez également que si votre amitié est une relation symétrique (à savoir si un userA est un ami à userB, puis userB est un ami à userA), il vaut mieux stocké dans une table comme ceci:

userA userB 

avec une contrainte de vérification:

userA < user B 

Yuo toujours mis à l'utilisateur moins id premier.

Dans ce cas, votre requête comme ceci:

SELECT * 
FROM content 
WHERE public = 1 
UNION ALL 
SELECT * 
FROM content 
WHERE public = 3 
     AND EXISTS 
     (
     SELECT NULL 
     FROM friends 
     WHERE userA = @me 
       AND userB = content.author 
     UNION ALL 
     SELECT NULL 
     FROM friends 
     WHERE userB = @me 
       AND userA = content.author 
     ) 
Questions connexes