我在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
的{{1}}。 有没有办法在不执行该查询两次的情况下执行此操作?因为(虽然我没有对其进行分析)但我怀疑上述查询是非常不具备性能的。作为次要问题,是否有更好的方法来执行子查询?
编辑:有人要求提供样本数据和输出。我在这里给出了user_id_2
表。我保证所有这些用户实际上都存在于Links
表中,因此您无需担心连接失败或类似的事情。但是我认为这个问题应该在没有加入Users
的情况下应该回答。
Users
如果我们对A执行此查询,则上面的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
查询应返回除E之外的所有人(其他人都是其他人)。我正在寻找的查询需要返回表中除{5和6之外的所有Users
,其中涉及E.特别是它需要返回2和4,以及直接涉及A的链接。 / p>