具有自联接的MYSQL自引用逻辑

时间:2012-02-02 10:14:14

标签: mysql self-join

我有一个名为friends的表,其中包含idname以及一个名为friendship的自联接表,用于存储包含friend_id和friend2_id的关系。 如果给出特定frnd的名称,我如何获得相关朋友的姓名

示例

id name
1  jack
2  kurt
3  jim

friendship
f_id f1_id
1    3 

所以如果我给'jack'我应该jim回来

1 个答案:

答案 0 :(得分:0)

您可以在一个查询或两个查询中执行此操作,具体取决于您要完成的任务。

一个简单的可能是:

SELECT
  f_id,
  f1_id
FROM
  friendship
WHERE
  f_id=1
  OR
  f1_id=1

然后你可以通过如下声明获得特定的朋友:

SELECT name FROM people WHERE id IN(2,3)

替代方案是自连接,但这里的难点是你的id可能同时在f_id和f1_id中,因此需要一些UNION命令或类似的东西(未经测试):

SELECT
  p1.name,
  p2.name,
FROM
  friendship
  INNER JOIN
    people AS p1
      ON friendship.f_id = people.id
  INNER JOIN
    people AS p2
      ON friendship.f1_id = people.id
WHERE
  p1.id=1 OR p2.id=1

我会彻底检查这些选项的速度,因为它们对大量记录非常沉重。如果你测量你需要更多性能尝试一些替代方案。例如,当你总是将f_id中最小的people.id和f1_id中较大的一个放在f1_id中时,你可以运行两个你联合的查询。另一种方法是,如果经常需要,可以对一小部分进行非规范化以缓存结果。

例如,如果要将名称添加到友谊表中,它可以节省很多联接:

SELECT
  f_id,
  f1_id,
  f_name,
  f1_name
FROM
  friendship
WHERE
  f_id=1
  OR
  f1_id=1