Php 使用mysql的朋友关系?

Php 使用mysql的朋友关系?,php,mysql,Php,Mysql,我有两张桌子: user{id,name,password....}; friends{id,user_id,user_id2,accept(bool)} 例如,假设我想为用户_id=14获取朋友,并且行accept必须为1!我将如何进行mysql查询谢谢:) 另外,如果user1是user2的朋友,那么在处理查询时,它必须是双向的 也意味着user2和user1是朋友,如果你明白我的意思的话!:) 这将为您提供接受好友的user_id=14的每一行 SELECT * FROM fri

我有两张桌子:

user{id,name,password....};
friends{id,user_id,user_id2,accept(bool)}
例如,假设我想为用户_id=14获取朋友,并且行accept必须为1!我将如何进行mysql查询谢谢:)

另外,如果user1是user2的朋友,那么在处理查询时,它必须是双向的
也意味着user2和user1是朋友,如果你明白我的意思的话!:)

这将为您提供接受好友的user_id=14的每一行

SELECT
  *
FROM
  friends
WHERE
  user_id = 14
  AND
  accept = TRUE

这将为您提供接受好友的user_id=14的每一行

SELECT
  *
FROM
  friends
WHERE
  user_id = 14
  AND
  accept = TRUE

请尝试以下方法

select 
 f1.user_id2 
from 
 user u,friends f1 , friends f2
where
f1.user_id1 = 14,
f1.accept = 1,
f1.user_id2 = f2.user_id1,
f2.user_id2 = f1.user_id1,
f2.accept = 1
谢谢, 罗汉


编辑:只有当你需要朋友的详细信息时,加入用户u表才有意义。否则,您可以取出用户u表。

请尝试以下操作

select 
 f1.user_id2 
from 
 user u,friends f1 , friends f2
where
f1.user_id1 = 14,
f1.accept = 1,
f1.user_id2 = f2.user_id1,
f2.user_id2 = f1.user_id1,
f2.accept = 1
谢谢, 罗汉


编辑:只有当你需要朋友的详细信息时,加入用户u表才有意义。否则,您可以将用户u表取出。

我可能不会在两个表中这样做。对我来说,在用户之间建立多对多关系更有意义。您遇到的问题是,您正在限制friends表中“friends”的数量。除非您将friends表作为user的子级。我假设friends表中有一个外键指向用户。我认为你已经做到了一部分,但不确定为什么你有用户id2,因为它在关系上没有意义。在这种情况下,查询将是:

select *
from user
   inner join friends on friends.user_id = user.id
where friends.id = true

我可能不会在两张桌子上这样做。对我来说,在用户之间建立多对多关系更有意义。您遇到的问题是,您正在限制friends表中“friends”的数量。除非您将friends表作为user的子级。我假设friends表中有一个外键指向用户。我认为你已经做到了一部分,但不确定为什么你有用户id2,因为它在关系上没有意义。在这种情况下,查询将是:

select *
from user
   inner join friends on friends.user_id = user.id
where friends.id = true

我并不是想贬低你,但这是非常非常基本的sql,你可以很容易地通过谷歌或书籍找到答案。话虽如此,答案是这样的

SELECT * FROM friends WHERE (user_id=14 OR user_id2=14) AND accept=true;
让我为您详细介绍一下,因为您使用的是SQL,如果您不学习它,您将浪费大量时间来搜索答案

SELECT * FROM friends
意思是从朋友那里得到所有的信息。“*”替换列名,表示“所有列”。例如,如果你有

SELECT (id,user_id) FROM friends
返回的行将只包含这些列

然后是WHERE子句

WHERE (user_id=14 OR user_id2=14) AND accept=true
表示它的确切外观:您选择的行应至少具有一个等于14的user_id,并且accept应为true。MySQL对布尔值使用true、false和null(如果允许的话)。其他一些数据库,如MSSQL,使用“位”类型而不是布尔值,分别使用1、0或null表示true、false和null

OR子句是因为,正如您在编辑中所述,这种友谊可以是“双向的”

所以如果你把它放在一起

SELECT * FROM friends WHERE (user_id=14 OR user_id2=14) AND accept=true;

我并不是想贬低你,但这是非常非常基本的sql,你可以很容易地通过谷歌或书籍找到答案。话虽如此,答案是这样的

SELECT * FROM friends WHERE (user_id=14 OR user_id2=14) AND accept=true;
让我为您详细介绍一下,因为您使用的是SQL,如果您不学习它,您将浪费大量时间来搜索答案

SELECT * FROM friends
意思是从朋友那里得到所有的信息。“*”替换列名,表示“所有列”。例如,如果你有

SELECT (id,user_id) FROM friends
返回的行将只包含这些列

然后是WHERE子句

WHERE (user_id=14 OR user_id2=14) AND accept=true
表示它的确切外观:您选择的行应至少具有一个等于14的user_id,并且accept应为true。MySQL对布尔值使用true、false和null(如果允许的话)。其他一些数据库,如MSSQL,使用“位”类型而不是布尔值,分别使用1、0或null表示true、false和null

OR子句是因为,正如您在编辑中所述,这种友谊可以是“双向的”

所以如果你把它放在一起

SELECT * FROM friends WHERE (user_id=14 OR user_id2=14) AND accept=true;

我认为这会给你重复的结果。这实际上取决于他是如何插入数据的。基于他的问题,我真的说不出来,但我的假设是“如果user1是user2的好友,那么user_id是user1,user_id2是user2,但是user2也可以是user1的好友,在这种情况下,数据库中会有一行user2是user_id,user1是user_id2。”这种架构至少可以说很糟糕,但是我回答了这个问题。如果建筑很糟糕,那么你为什么不给我们一个建议,我相信很多人会从中学习!!再想一想,我认为连接表是唯一的方法。但是,您应该将user_id和user_id2作为用户表的外键,而不是好友上的id。这将处理重复项。在插入用户id和用户id2之前,您可能需要检查它们是否分别等于用户id2和用户id。我不认为MySql会为您这样做。我认为这会给您重复的结果。这实际上取决于他如何插入数据。基于他的问题,我真的说不出来,但我的假设是“如果user1是user2的好友,那么user_id是user1,user_id2是user2,但是user2也可以是user1的好友,在这种情况下,数据库中会有一行user2是user_id,user1是user_id2。”这种架构至少可以说很糟糕,但是我回答了这个问题。如果建筑很糟糕,那么你为什么不给我们一个建议,我相信很多人会从中学习!!再想一想,我认为连接表是唯一的方法。但是,您应该将user_id和user_id2作为用户表的外键,而不是好友上的id。这将处理重复项。在插入用户id和用户id2之前,您可能需要检查它们是否分别等于用户id2和用户id。我不认为MySql会为你这么做。Ping请澄清。如果A和B是朋友,朋友表中有两条记录-->(0,A,B,true);(1,B,A,true)如果双方都接受了友谊。(0,A,B,虚假);(1,B)