我有一个名为friends的表,其中包含id
和name
以及一个名为friendship的自联接表,用于存储包含friend_id和friend2_id的关系。
如果给出特定frnd的名称,我如何获得相关朋友的姓名
示例
id name
1 jack
2 kurt
3 jim
和
friendship
f_id f1_id
1 3
所以如果我给'jack
'我应该jim
回来
答案 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