2010-09-15 5 views
1

J'utilise la requête suivante pour obtenir l'identifiant et le nom d'utilisateur d'un ami dans une base MySQL:Obtenir des données amis dans mysql

SELECT 
     DISTINCT members.id AS userid, 
     members.gebruikersnaam AS username, 
     members.pasfoto AS avatar, 
     members.id AS link, 
    FROM 
     friends 
    JOIN 
     members 
    ON 
     friends.friend_out = members.id 
    WHERE 
     (
      friends.friend_in = '".mysql_real_escape_string($userid)."' 
     OR 
      friends.friend_out = '".mysql_real_escape_string($userid)."' 
     ) 

    AND 
     friends.active = 1 
    ORDER BY 
     members.username 
    ASC 

Dans la table d'amis il y a une ligne pour chaque amitié, de sorte que l'amitié est dans les deux sens.

Par exemple:

friend_in ----- friend_out

4 ------------- 6 ---------

Donc, c'est la seule ligne pour une amitié entre l'utilisateur 4 et 6.

Dans la requête ci-dessus, je veux obtenir les données d'un ami de l'utilisateur connecté. Je dois donc vérifier si friend_in est l'utilisateur connecté (donc friend_out doit être retourné par l'instruction select) de friend_out est l'utilisateur connecté (donc friend_in doit être retourné par l'instruction select).

Dans la requête ci-dessus, il doit y avoir quelque chose de changé dans de join pour récupérer les données des amis.

Quelqu'un peut-il m'aider avec ce problème?

Répondre

0

Le problème est que votre relation d'amitié est non-symétrique et que vous ne vous joignez qu'à la fin de l'amitié, mais vous ne savez pas si ce sera l'utilisateur lui-même ou son ami. Essayez de le changer en UNION au lieu de O WH ... OU ...

SELECT 
    members.id AS userid, 
    members.gebruikersnaam AS username, 
    members.pasfoto AS avatar, 
    members.id AS link, 
FROM members 
JOIN (
    SELECT friends.friend_out AS member_id 
    FROM friends 
    WHERE friends.friend_in = '123' 
    AND friends.active = 1 
    UNION 
    SELECT friends.friend_in AS member_id 
    FROM friends 
    WHERE friends.friend_out = '123' 
    AND friends.active = 1 
) T1 ON members.id = T1.member_id 
ORDER BY members.username 
+0

Oh je suis désolé, je l'ai traduit en anglais. Mais ce n'est pas le problème en fait. Votre deuxième remarque est le problème en effet. Mais est-il possible de créer une condition de jointure pour rejoindre l'identifiant des amis et non l'identifiant de l'utilisateur? Parce qu'un syndicat tout est rigoureux je pense. Je veux seulement les données d'ami comme résultat, au lieu des données d'ami et d'utilisateur. – Arjen

+0

@Arjen: Je ne suis pas sûr de ce que vous entendez par "trop ​​rigoureux". C'est comme ça que je le ferais. L'alternative est de stocker toutes les amitiés deux fois (une fois dans chaque direction) - alors vous pouvez simplifier la requête beaucoup au prix de doubler votre stockage de données. –

Questions connexes