如何建立友谊关系的模型

3

我一直在试图解决如何做到这一点,即使查看其他示例,我也无法弄清楚,所以也许我可以得到一些个性化的帮助。

我有两个表:users_statusfriendships

users_status表中,我有一个字段userid和其他几个字段。 在friendships表中,我有request_torequest_fromfriendship_status字段。

基本上,我想做的是获取当前用户的所有状态帖子以及当前用户的朋友们的状态帖子(我可以在我的PHP中使用$userid变量来指定)。

以下是friendships表结构的示例。当发送好友请求时,将发送者和接收者的userid放入表中,并将friendship_status设置为0。当请求被接受时,friendship_status设置为1,这两个人就成为朋友了。

friendship_id   request_from    request_to  friendship_status
1               111248          111249      1
2               111209          111249      1
3               111209          111248      0
11              111209          111259      1
5               111252          111209      1
12              111261          111209      1

我意识到这可能不是确定友谊关系的最佳结构,特别是因为该网站是基于关系的,必须经常检查友谊连接。也许为friend_requestsfriendships分别建立两个表格会更好?如果是这样,我应该如何构建/管理friendships表格?
2个回答

4
您可以使用表连接(例如http://dev.mysql.com/doc/refman/5.0/en/join.html)来查找所有请求。
实际上,您可以在此处使用子查询:
SELECT * FROM users_status WHERE userid = "$userid" 
    OR userid in (SELECT request_to   FROM friendships where request_from = "$userid" AND friendship_status = 1)
    OR userid in (SELECT request_from FROM friendships where request_to   = "$userid" AND friendship_status = 1)

用您的用户ID替换$userid


我知道JOIN是一种选项,我也尝试过了,但我不知道如何让它在我的特定情况下工作。这就是为什么我发布了这个问题。我需要更个性化的帮助。 - vertigoelectric
@vertigoelectric 实际上你不需要使用 JOIN -- 子查询就足够了。我更新了我的回答。 - Foo Bah
@Foo Bah,我也尝试了子查询。我尝试了你的例子,但它似乎没有正确地检查userid是否在request_to或request_from中。我以userA的身份进行了测试,他向userB发送了一个请求,并得到了接受。userA可以看到自己和朋友的状态帖子,但是userB不能看到来自userA的状态帖子,即使他们都是朋友。我在你的例子中交换了“request_to”和“request_from”,然后userA就再也看不到userB的帖子了,这是一种预期的反转(但是userB仍然可以看到两者,这很奇怪)。 - vertigoelectric
@MostyMostacho,看起来你比我更快地表达了观点。我期待着Foo Bah更新的例子。 - vertigoelectric
@vertigoelectric,您需要两个子查询--请查看我的回复。 - Foo Bah
显示剩余6条评论

3
我能想到的最简单的模式是:
PENDING_FRIENDSHIPS(request_from, request_to)
FRIENDSHIPS(request_from, request_to)

我还删除了ID,因为两个表上的两个字段将成为复合主键(request_from,request_to)。
要获取当前用户的所有好友,请运行:
select * from friendships
where $currentUser = request_from OR $currentUser = request_to

这将返回两列,您需要在 PHP 中删除当前用户。
从此模式获取所有朋友的另一种方法是运行 UNION:
select request_from from friendships
where request_to = $currentUser
UNION
select request_to from friendships
where request_from = $currentUser

这个解决方案的缺点是你要运行两个查询。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接