2011-11-16 109 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友谊请求尚未确认。