2010-09-15 36 views
1

我使用下面的查询来获取ID和一个朋友在MySQL的用户名好友资料:获得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 

在好友桌子上有一排为每个友谊,使友谊是两种方式。

例如:

friend_in ----- friend_out

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

所以这是用户4和6之间友谊的唯一行。

在上面的查询中,我想获取登录用户的朋友数据。所以我必须检查friend_in是否是登录用户(所以friend_out必须由select语句返回),friend_out是登录用户(所以friend_in必须由select语句返回)。

在上面的查询中,必须更改de join以获取朋友数据。

任何人都可以帮我解决这个问题吗?

回答

0

问题是你的友谊关系是非对称的,你只加入友谊的一端,但你不知道这是用户自己还是他们的朋友。尝试将其更改为UNION而不是WHERE ...或...

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

对不起,我把它翻译成英文。但实际上这不是问题。你的第二个评论的确是问题。但是,是否可以创建加入条件来加入好友ID而不是用户ID?因为我认为工会都是严谨的。我只需要朋友数据,而不是朋友和用户数据。 – Arjen 2010-09-15 14:31:57

+0

@Arjen:我不确定你的意思是“太严谨”。这是我会这样做的方式。另一种方法是将所有的友谊存储两次(每个方向一次) - 然后您可以简化查询,但需要花费双倍的数据存储。 – 2010-09-15 14:40:38