0

我有一些问题要在 mysql 上查询一个自我多对多关系我有一个 Person 表和一个 Friendship 表

个人
pid | 姓名 | 年龄
1 吉米 18
2 卢卡斯 25
3 玛丽 12
4 玛丽 40
5 约翰 30

友谊
pid | pId2
1 3
2 3
4 1
5 3


所以我需要检查玛丽的朋友是什么(正确答案:卢卡斯和约翰)

通过以下查询,我得到了 pid 的答案

SELECT p.name
FROM Person p
WHERE EXISTS(SELECT NULL
    FROM Friendship f
    WHERE p.pid = f.pid
    AND (f.pid2 = 4 OR f.pid2 = 3))
OR EXISTS(SELECT NULL
    FROM Friendship f
    WHERE p.pid = f.pid2
    AND (f.pid = 4 OR f.pid = 3))  

但是如果我需要按名称查询怎么办?跟随一个不起作用

SELECT p.name
FROM Person p
WHERE EXISTS(SELECT NULL
    FROM Friendship f
    WHERE p.pid = f.pid
    AND f.pid2 = (SELECT pid FROM Person WHERE name = 'Marie'))
OR EXISTS(SELECT NULL
    FROM Friendship f
    WHERE p.pid = f.pid2
    AND f.pid = (SELECT pid FROM Person WHERE name = 'Marie')) 

谢谢你们的帮助

4

1 回答 1

0

我会通过加入来做到这一点。

SELECT fr.name FROM Person fr INNER JOIN Friendship ON(fr.pid = Friendship.pid2) INNER JOIN Person p ON(Friendship.pid = p.pid) WHERE p.name = 'Marie';

不过,您也可以通过 JOIN 和子选择来做到这一点。

SELECT name FROM Person INNER JOIN Friendship ON(Person.pid = Friendship.pid2) WHERE Friendship.pid IN (SELECT pid FROM Person WHERE name = 'Marie'); 
于 2011-03-30T02:28:17.363 回答