2009-08-13 7 views
1

J'ai deux tables avec la structure suivante:rejoindre comme une alternative à multiples ou de

table name: friends 
uid (PK)(FK) 
friend_id (PK)(FK) 

table name: posts 
post_id (AI)(PK) 
post_text 
uid (FK) //poster id 

Je voudrais sélectionner les messages qui ont été seulement fait des amis de l'utilisateur x. Mon plan inital était d'utiliser le code suivant:


SELECT posts.post_text INNER JOIN friends ON posts.uid = friends.friend_id 
WHERE friends.uid = x 

Cependant, cela ne semble pas fonctionner. . (Je suis tous les messages fait par x, fait tous les messages effectuées par de X amis La seule alternative que je peux penser est d'utiliser un (peut-être très longue) chaîne de OR de - comme dans

WHERE posts.uid = 'friend_id_1' OR posts.uid = 'friend_id_2' ect.. 

Toute alternative solutions? Merci.

Répondre

1
SELECT posts.* 
FROM friends 
JOIN posts 
ON  posts.uid = friends.friend_id 
WHERE friends.uid = 'x' 

Cette requête devrait fonctionner, afin de mieux vous vérifier vos données.

ne vous a pas de temps à X son ami?

Si votre relation d'amitié est symétrique, i. e. si X est un ami à Y, puis Y est un ami à X, alors vous devriez faire la table comme ceci:

friends (a, b, PRIMARY KEY (a, b), KEY (b)) 

SELECT posts.* 
FROM (
     SELECT b AS friend_id 
     FROM friends 
     WHERE a = 'X' 
     UNION ALL 
     SELECT a AS friend_id 
     FROM friends 
     WHERE b = 'X' 
     ) friends 
JOIN posts 
ON  posts.uid = friends.friend_id 

Avant d'insérer une paire d'amis, faites toujours en sorte que A < B, i. e. l'utilisateur avec le moins user_id entre dans A.

+0

Si vos données a en effet x comme ami d'eux-mêmes, vous pouvez exclure ce cas en ajoutant: « ET friends.friend_id = x » à cette requête. – MtnViewMark

0

Je pense que c'est ce que vous cherchez

SELECT posts.post_text INNER JOIN friends ON posts.uid = friends.friend_id 
Inner join friends fr on friends.friend_id = fr.uid 
WHERE friends.uid = x