2010-09-15 40 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