Php 在mysql中设置好友列表

Php 在mysql中设置好友列表,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我想在我的在线游戏中建立一个朋友列表。我不知道如何设置或从哪里开始。添加朋友和接受朋友部分我可以处理,但我不知道如何在mysql和php中设置它。连接到每个用户或某物的用户(朋友)列表?如果您的友谊关系是对称的,您可以将每一对存储在单独的记录中: friend1 friend2 A B B A A C B D C B D B 然后像这样查询所有B的朋友: SELECT friend2 FROM friends WH

我想在我的在线游戏中建立一个朋友列表。我不知道如何设置或从哪里开始。添加朋友和接受朋友部分我可以处理,但我不知道如何在mysql和php中设置它。连接到每个用户或某物的用户(朋友)列表?

如果您的友谊关系是对称的,您可以将每一对存储在单独的记录中:

friend1 friend2
A       B
B       A
A       C
B       D
C       B
D       B
然后像这样查询所有
B
的朋友:

SELECT  friend2
FROM    friends
WHERE   friend1 = 'B'
SELECT  friend1
FROM    friends
WHERE   friend2 = 'B'
UNION ALL
SELECT  friend2
FROM    friends
WHERE   friend1 = 'B'
或者在第一个字段中存储id最小的用户,在第二个字段中存储id最大的用户:

friend1  friend2
A        B
A        C
B        D
然后像这样查询
B
的朋友:

SELECT  friend2
FROM    friends
WHERE   friend1 = 'B'
SELECT  friend1
FROM    friends
WHERE   friend2 = 'B'
UNION ALL
SELECT  friend2
FROM    friends
WHERE   friend1 = 'B'
MySQL
中,第一个选项的效率稍微高一点,如果您的友谊关系不是对称的,这是唯一的选项(如
LiveJournal

见本文:


    • 友谊本质上是两个人之间的相互关系。就数据库而言,这是两个用户之间的多对多关系

      所以,您需要的是一个链接表,它通过ID保存对两个用户的引用

      例子 用户表

      ID    Username
      1     Bob
      2     Jim
      3     Alice
      
      朋友桌

      user1    user2
      1        2
      2        3
      

      这将使鲍勃成为吉姆的朋友,吉姆也成为爱丽丝的朋友。

      在stackoverflow上的另一篇文章中查看答案……一些简单但很好的解释可以帮助你完成你所需要的


      另一种选择是将A列设置为如下所示: $checkfriend=($friend1$friend2)| |($friend2$friend1))

      B栏如下: (接受友谊或拒绝友谊)根据用户选择


      基本上,user1和user2都在同一列中。

      Hi@robinjam!我只是想和你核实一下。如果我的朋友列表是对称的,它应该是这样的:如果1是2的朋友,那么2是1的朋友。在表中为其关系创建两行条目。谢谢Mike Sanchez:Friends表是对相互友谊的建模,所以每个友谊需要1行,而不是每人1行。我打算在php+mysql环境中尝试使用这种设置。如果我错了,请纠正我,但在你这样的设置下,我将不得不使用UNION。与在表中创建两个条目不同,我可以只使用一个WHERE user1=“1”语句。你能打开一个新问题而不是发表评论吗?你需要在关系表上分配一个主键吗?@Mike:当然可以,这样可以消除重复项并加快搜索速度。关系表本身也可以有属性(比如建立友谊的日期等)。若我理解正确,你们说的是复合主键,对吗?主键和外键都引用回“用户”表。@MikeSanchez:
      创建表友谊(a INT NOT NULL引用用户,b INT NOT NULL引用用户,主键(a,b))