2011-02-08 73 views
0

我正在一個網站上工作,並且正在實施一個朋友系統。人們可以成爲朋友,這將解鎖一些不重要的東西。它使用MySQL編碼爲數據庫。關於mysql連接的問題

比方說這是我的帳戶表

id | name | picture 
0 | Jorik | Cat.jpg 
1 | Joost | Fish.jpg 
2 | Henk | Ferret.png 

這是朋友表(難道這要做到這一點的好辦法?)

id | user id | friend id | invite date | accepted 
0 | 0  | 1   | 123   | 0 
1 | 2  | 0   | 456   | 1 
2 | 1  | 2   | 123   | 1 

我檢查,如果他們是朋友是這樣的如下(可能是一個錯誤,但你明白了)。

$ fid =朋友ID,$ uid =用戶ID。

WHERE ((`userid` = '{$uid}' && `friendid` = '{fid}') || (`friendid` = '{$uid}' && `userid` = '{$fid}')) 

首先,這是一個這樣做的有效方式還是有更好的方法嗎?

如果我想獲得一個用戶我

WHERE (`userid` = '{$uid}' || `friendid` = '{$uid}') 

現在可以運行此查詢,如果我會運行此查詢用戶0好友列表,它會返回

id | user id | friend id | invite date | accepted 
0 | 0  | 1   | 123   | 0 
1 | 2  | 0   | 456   | 1 

我曾與MySQL加入之前,但我不知道如何返回類似於以下結果

id | friend id | invite date | accepted | Name | Picture 
0 | 1   | 123   | 0  | Joost | Fish.jpg 
1 | 2   | 456   | 1  | Jorik | Ferret.png 

它將不得不檢查它是否應該從帳戶表中加入好友ID或帶有ID的用戶ID。 (被邀請的人是朋友ID,邀請他的人將獲得用戶ID。)

我希望我提供了足夠的信息。

任何人都可以幫助我嗎?

由於提前,

Jorik

回答

0

我的$ 0.02:

1)歸一化數據:擺脫要麼 '用戶ID' 或 '身份證' 的。您只需要一個唯一的帳戶列。

2)做一個表, '朋友',像這樣:

(約) 創建表友(用戶ID INT無符號,FriendUserId INT無符號,指數(用戶ID,FriendUserId));

然後爲每個「朋友」添加一行,其中「FriendUserId」是每個人的帳戶ID(請參閱#1)。

3)製作的表 '邀請' 像這樣: (APPX) 創建表邀請(用戶ID INT無符號,FriendId INT無符號,INVITEDATE日期時間缺省時間戳,接受TINYINT(1)默認值0,主鍵(用戶標識,FriendId));

爲每個邀請添加一行並在其接受時更新。

我們得到一個人的朋友:

SELECT * FROM帳戶上a.UserId = f.UserId其中a.UserId =一個朋友加盟F;

得到邀請:

SELECT * FROM賬戶加入邀請我上a.UserId = i.UserId

等等......

..但比什麼都重要..避免重複數據..

0

如果我正確理解你的問題,這樣的事情可能工作:

SELECT a.user_id as orig_user_id, f.*, ab.* 
FROM account a 
JOIN friends f 
ON f.user_id=a.id 
JOIN account ab 
ON f.friend_id=ab.user_id 
WHERE a.id={$uid} 

我沒有測試此SQL,但你得到的圖片。基本上,選擇您想要找到其朋友的用戶所在的行,然後加入他們的好友行,然後加入他們的朋友的用戶帳戶行。你可能需要別名一些列名來清楚你的代碼。您將有重複的內容,因爲您加入了帳戶表。

+0

嗯,可能會工作,但沒有辦法做到這一點,如:如果`friendid` = {$ uid}那麼accountid = userid其他accountid =`friendid`現在加入帳戶表與accountid。我只是不知道如何在MySQL中做到這一點,如果它是有效的。 – Jorik 2011-02-08 18:09:19

+0

您可能可以使用條件,但這確實會使查詢變慢。你所描述的是連接中的條件。加入說,如果有這個用戶ID的朋友行加入他們和他們各自的帳戶行。如果您的索引設置正確,這是您佈局的最佳解決方案。只要確保你在這些行上有鍵,並且如果你使用的是InnoDB,則使用約束/ FK。我傾向於同意jyeargers解決方案爲您的表格佈局,這將是處理數據的最有效方式。 – superultranova 2011-02-08 18:13:51