0

我在 MySQL 中有几个表代表一个无向图。该Users表有一个user_id(以及我现在不需要的其他一些东西),而该Links表有一个user_id_1user_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 的链接。

4

0 回答 0