关于mysql加入的问题

时间:2011-02-08 17:34:52

标签: php mysql

我正在网站上工作,我正在实施一个朋友系统。人们可以成为朋友,这将解锁一些不重要的东西。它用PHP编码,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

2 个答案:

答案 0 :(得分: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,但是你得到了这张照片。基本上,为您要查找其朋友的用户选择行,然后加入他们的朋友行,然后为他们的朋友加入用户帐户行。您可能需要为某些列名称添加别名,以便在代码中明确说明。您将有重复项,因为您要加倍加入帐户表。

答案 1 :(得分:0)

我的0.02美元:

1)规范化您的数据:摆脱'userid'或'id'。您只需要一个唯一的帐户列。

2)为“朋友”制作一张桌子,如下所示:

(约) create table Friends(UserId int unsigned,FriendUserId int unsigned,index(UserId,FriendUserId));

然后为每个'朋友'添加一行,其中'FriendUserId'是每个人的帐户ID(请参阅#1)。

3)为“邀请”制作一个表格如下: (APPX) create table Invites(UserId int unsigned,FriendId int unsigned,InviteDate datetime default timestamp,Accepted tinyint(1)default 0,primary key(UserId,FriendId));

为每个邀请添加一行,并在接受时接受更新。

现在要找个朋友:

从帐户中选择*加入朋友f a.UserId = f.UserId其中a.UserId =;

获取邀请:

从帐户中选择*加入邀请i on a.UserId = i.UserId

等等......

..但比什么都重要..避免重复数据..