1

我正在尝试使用相同的表数据(即用户)设置双向多对多关系,我还有一个名为 Userusers 的链接表,它将一个用户与另一个用户连接起来,但我不确定如何处理双向端,因为我的代码的结果只显示了一个方向。

--Table User:

create table User (
    UserID          int auto_increment not null,
    UserFirstName   varchar(30) not null,
    UserSurname     varchar(30) not null,
    UserTel         char(10),
    UserCell        char(10),
    UserEmail       varchar(50) not null,
    UserPassword    varchar(50) not null,
    UserImage       varchar(50),
    UserAddress1    varchar(50),
    UserAddress2    varchar(50),
    UserTown/City   varchar(50),
    UserProvince    varchar(50),
    UserCountry     varchar(50),
    UserPostalCode  varchar(50),
    Primary key(UserID)
)

--Table Userusers:

create table UserUsers  (
    UserID          int not null,
    FriendID        int not null,
    primary key(UserID, FriendID),
    foreign key(UserID) references User(UserID),
    foreign key(FriendID) references User(UserID)
)

PHP代码:

$sql="SELECT * FROM User u INNER JOIN UserUsers uu ON uu.UserID = u.UserID INNER JOIN User f ON f.UserID = uu.FriendID WHERE uu.UserID = " . $_SESSION['userID'];
4

1 回答 1

1

实际上,不,您的表确实显示了双向关系。

考虑您的表 UsersUsers

userID 列表示与friendID 成为朋友的人。

假设用户 1 想和用户 2 成为朋友

我们的 UsersUsers 表如下所示:

UserID   |   FriendID
  1              2

当然,我们看到现在 User 1 和 2 之间有了关系,但我们也看到 User1 已经发起了友谊,显示了从 1 -> 2 的方向

现在当 User2 想要接受友谊时,我们可以在表中插入另一条记录,使其:

UserID   |   FriendID
  1              2
  2              1

肯定有一些更好的元数据可以添加到关系表中,以了解有关创建的关系的更多信息,但 UserID 字段应视为owner, 或sender,而 FriendID 应视为receiver.

所以 - 您已经为您完成了大部分工作,现在您所要做的就是创建查询以对这种双向关系采取行动。

获取 User1 的所有已确认好友:

我们将假设 $the_logged_in_user_id = 1

SELECT * from Users U JOIN UsersUsers F ON U.UserID = F.UserID WHERE F.FriendID = '$the_logged_in_user_id'

这将显示所有已确认的友谊$the_logged_in_user_id,假设这就是你想要的。

于 2013-02-21T08:12:21.003 回答