2011-11-16 54 views
1

我想寫一個朋友系統是這樣工作的:PHP/MySQL中的朋友系統?

  1. 用戶A發送好友請求,以用戶B.
  2. 用戶B接受來自用戶A.
  3. 用戶A和B的好友請求現在是朋友了。

這裏是我的數據庫結構:

 
CREATE TABLE IF NOT EXISTS `users` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(16) NOT NULL, 
    `password` char(32) NOT NULL, 
    `email` varchar(80) NOT NULL, 
    `dname` varchar(24) NOT NULL, 
    `profile_img` varchar(255) NOT NULL DEFAULT '/images/default_user.png', 
    `created` int(11) NOT NULL, 
    `updated` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `email` (`email`), 
    UNIQUE KEY `username` (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ; 
 
CREATE TABLE IF NOT EXISTS `friend_requests` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_a` int(11) NOT NULL DEFAULT '0', 
    `user_b` int(11) NOT NULL DEFAULT '0', 
    `viewed` tinyint(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ; 
 
CREATE TABLE IF NOT EXISTS `friends` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_a` int(11) NOT NULL DEFAULT '0', 
    `user_b` int(11) NOT NULL DEFAULT '0', 
    `friend_type` int(3) NOT NULL DEFAULT '1', 
    `friends_since` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

我可以列出用戶 「SELECT * FROM朋友WHERE USER_A = $用戶ID或USER_B = $用戶ID」,但朋友我如何從users表中獲得如usernameprofile_img的數據?

+1

你必須做另一個'SELECT'語句或'INNER JOIN'。 – ComFreek

回答

2
SELECT DISTINCT 
a.username, 
a.profile_img 
FROM 
users a 
WHERE 
a.id in (SELECT user_a FROM friends WHERE user_a = $userid OR user_b = $userID) 
and a.id <> $userid 

UNION 

SELECT 
b.username, 
b.profile_img 
FROM 
users b 
WHERE 
b.id in (SELECT user_b FROM friends WHERE user_a = $userid OR user_b = $userID) 
and b.id <> $userid 
+1

您可以使用PHP進行管理。在循環時檢查id,如果等於$ userID,則轉到下一個結果。或者閱讀我上面的回覆編輯,每個SQL塊(和a.id <> $ userID)(和b.id <> $ userID)的最後兩行都是 – Hamikzo

+0

我仍然認爲數據庫結構設計不佳。在使用友誼請求表和友誼表時,您在友誼中擁有冗餘。在我看來,友誼要求是一種沒有「批准」的友誼。 –

0

您需要使用連接將表格朋友加入用戶。 如:

SELECT * FROM friends as f INNER JOIN users AS u ON u.id = f.user_a WHERE user_a = $userid 
9

我想你已經overthunk你的問題有點(!)。

您可能只有User表和Friendship表。你的友誼表可能包含UserID int, FriendID int, Created_at datetime, Confirmed_at datetime

select * from User 
    left outer join Friendship on User.ID = Friendship.UserID 
    left outer join User as Friend on Friendship.FriendID = Friend.ID 
    where User.ID = <some users ID> 

編輯:我可能有overthunk它自己的第一次圍繞;)

select * from Friendship 
    inner join User on Friendship.FriendID = User.ID 
    where Friendship.UserID = <some users ID> 

這會得到用戶的朋友... (MSSQL語法)

哦,我忘了。當Confirmed_atnull友誼請求尚未確認。