我在 MySQL 中有几个表代表一个无向图。该Users
表有一个user_id
(以及我现在不需要的其他一些东西),而该Links
表有一个user_id_1
和user_id_2
(以及我需要随身携带的一些其他数据)。我正在尝试获取给定用户的邻居(包括他自己)之间的所有链接。我的问题基本上是:我该怎么做?我设法通过以下有点不幸的查询获得了用户的所有邻居以及他自己:
SELECT u.* FROM Users u
JOIN Links l ON u.user_id = l.user_id_1
WHERE l.user_id_2 = @arg
UNION
SELECT u.* FROM Users u
JOIN Links l ON u.user_id = l.user_id_2
WHERE l.user_id_1 = @arg
UNION
SELECT * FROM Users
WHERE user_id = @arg
现在我想准确地选择Links
两者都user_id_1
出现user_id_2
在上述查询中的那些。有没有办法在不执行该查询两次的情况下做到这一点?因为(尽管我没有对其进行分析)我有这种偷偷摸摸的怀疑,即上述查询非常不高效。作为次要问题,是否有更好的方法来执行子查询?
编辑:已经被要求提供样本数据和输出,这里是。我给Links
这里的桌子。我保证所有这些用户实际上都存在于Users
表中,因此您无需担心连接失败或类似情况。但是我认为这个问题应该是可以回答的,根本不需要加入Users
。
link_id user_id_1 user_id_2
1 A B
2 C B
3 C A
4 D C
5 C E
6 D E
7 A D
8 F A
如果我们然后对 A 执行此查询,则Users
上面的查询应该返回除 E 之外的所有人,E 不是 A 的邻居(所有其他人都是)。我要查找的查询需要返回Links
表中除 5 和 6 之外的所有涉及 E 的查询。特别是它需要返回 2 和 4,以及直接涉及 A 的链接。