0

我不确定我该怎么做,但我有两张桌子:

--users--
id_users (index)
name_users


--friend--
id_friend (index)
id_user (connects to id_users)
linked_friend (also links to id_users as this is the id of the requested friend)

对于请求的友谊,在friend.id_user col中请求的用户和他们请求在friend.linked_friend col中的用户存在一行。为了确认友谊链接,将创建另一行信息反转,以便每个友谊有两行,每个用户都在friend.id_user和friend.linked_friend列中。(如果我能以更好的方式做到这一点,请告诉我)

所以我需要为每个用户列出系统上所有已确认的友谊(两行)而不是他们自己的用户。

SELECT id_user, name_user FROM user WHERE id_user <> $userId

显然将自己从列表中删除,但我不知道如何选择具有两行的用户。

我希望这足够清楚。

谢谢

4

2 回答 2

0

如果要从两个或多个表中获取数据,则必须使用 Join。

尝试这个

select * from users left join friend on users.id_users = friend.id_user 

// 你还为特定的 user_id 提供了 where 条件

于 2013-03-02T09:51:37.077 回答
0

您可以join两次使用朋友表来要求存在两个方向的行:

select  u1.name
,       u2.name
from    users u1
join    friend f1
on      u1.id_users = f1.id_user
join    friend f2
on      f2.id_user = f1.linked_friend 
        and f2.linked_friend = f1.id_user
join    users u2
on      u2.is_users = f2.id_user
        and u1.id_users < u2.id_users -- Display friends once

我同意 Jack Pettinger 的观点,即这种设计相当笨拙。对于每个关系,friends 表中应该只有一行。它应该有一个独特的约束来强制执行,例如:

alter table Friends add constraint CHK_Friend check (friend1_id < friend2_id);
create index UX_Friends on Friends (friend1_id, friend2_id);
于 2013-03-02T09:32:52.610 回答