2011-10-13 39 views
1

我正在使用mysql的朋友表。我想要獲取朋友用戶名和用戶名錶單當前用戶名。與mysql的朋友表

friend 
======= 
- id 
- uid 
- fid 

Sample Data 
=========== 
id uid fid 
1 1 2 
2 3 1 

user 
====  
- id 
- username 

Sample Data 
=========== 
id username 
1 saturngod 
2 snow 
3 John 

我當前的代碼是

SELECT `user`.id,`user`.username FROM friend 
INNER JOIN User 
ON user.id = friend.uid 
WHERE friend.fid = (SELECT `id` FROM `User` WHERE `username`='saturngod') 

UNION 

SELECT `user`.id,`user`.username FROM friend 
INNER JOIN User 
ON user.id = friend.fid 
WHERE friend.uid = (SELECT `id` FROM `User` WHERE `username`='saturngod') 

它的工作。我收到了朋友名單。不過,我覺得,sql太長了。

我可以減少這個SQL,並且我們可以在沒有UNION的情況下寫入sql嗎?

回答

0

您已經加入了表格,所以不需要子選擇。

SELECT u.id,u.username 
    FROM user u 
    INNER JOIN friend f ON (u.id = f.uid) 
    WHERE u.username='saturngod' 
UNION ALL 
    SELECT u2.id,u2.username 
    FROM user u 
    INNER JOIN friend f ON (u.id = f.uid) 
    INNER JOIN user u2 ON (u2.id = f.fid) 
    WHERE u.username='saturngod' 

或者,你可以這樣做:

SELECT 
    u.id as user_id 
    ,u.username 
    ,u2.id as friend_id 
    ,u2.username as friendname 
    FROM user u 
    INNER JOIN friend f ON (u.id = f.uid) 
    LEFT JOIN user u2 ON (u2.id = f.fid) 
    WHERE 'saturngod' = u.username 

如果你想每個用戶一行,你可以這樣做:

SELECT 
    u.id as user_id 
    ,u.username 
    ,GROUP_CONCAT(u2.id) AS friend_ids 
    ,GROUP_CONCAT(u2.username) as friendnames 
    FROM user u 
    INNER JOIN friend f ON (u.id = f.uid) 
    LEFT JOIN user u2 ON (u2.id = f.fid) 
    WHERE 'saturngod' = u.username <<-- optional 
    GROUP BY u.id 
+0

不工作。它只能檢查user.id = friend.uid。它沒有檢查user.id = friend.fid。例如,用戶ID爲1的朋友是2和3.您的代碼只搜索2並且沒有顯示3. – saturngod

0
SELECT CASE WHEN user_id="$id" THEN friend_id ELSE user_id END AS friendID 
FROM user_friend WHERE user_id="$id" OR friend_id="$id" order by friendID ASC 
+0

您可能會添加一些文字來描述您正在做的事情。 – Sgoettschkes