设计一个表来保持朋友关系

时间:2013-07-10 20:45:24

标签: sql database database-design

我想设计一个包含朋友的表,两个人之间的关系,所以我设计了一个包含以下字段的表:FriendIdFriend_LFriend_R

这意味着此人Frind_L是此人的朋友Friend_R

但是这个设计有一个问题,我必须将每个朋友关系两次添加到表中,以便能够使用此查询找出给定人员的朋友:

SELECT Friend_R
FROM Friends
Where Friend_L= ANY INTEGER ;

任何人都有其他想法这样做而不重复每一个关系?

3 个答案:

答案 0 :(得分:1)

尝试使用其他查询?

 SELECT
  Friend_R as Friend
 FROM
  Friends
 WHERE
  Friend_L = :x
UNION
 SELECT
  Friend_L as Friend
 FROM
  Friends
 WHERE
  Friend_R = :x

第一个与您的相同,但UNION与其他查询应该返回所有替代结果。 UNION(没有ALL)也会为你删除重复项。

或者,如果您真的觉得有必要,可以使用CASE在一个中进行...

SELECT
 CASE WHEN (Friend_L = :x) THEN Friend_R ELSE Friend_L END AS Friend
FROM
 Friends
WHERE
 Friend_L = :x OR Friend_R = :x

答案 1 :(得分:0)

你不必这样做。假设您正在寻找id为20的用户的关系。

SELECT *
FROM friends
WHERE left_id = 20 or right_id = 20;

答案 2 :(得分:0)

您无需再添加两次。只需添加一次,然后使用UNION

SELECT Friend_R FROM Friends Where Friend_L= ANY INTEGER
UNION
SELECT Friend_L FROM Friends Where Friend_R= ANY INTEGER