SQL中的双向关系,有两个表,没有重复项

SQL中的双向关系,有两个表,没有重复项,sql,relational-database,Sql,Relational Database,假设您有两个表:user和friends——您希望将所有好友加入到您查询的用户中 显而易见的答案是: SELECT friend.uid FROM `user` JOIN friends ON user.uid = friends.user JOIN user AS friend ON friends.friend = friend.uid WHERE user.uid = $user_id 这很好,但这是一种单向关系。为了实现这一点,我必须为每个关系添加两行 另一方面,这是双向的: SELE

假设您有两个表:
user
friends
——您希望将所有好友加入到您查询的用户中

显而易见的答案是:

SELECT friend.uid
FROM `user`
JOIN friends ON user.uid = friends.user
JOIN user AS friend ON friends.friend = friend.uid
WHERE user.uid = $user_id
这很好,但这是一种单向关系。为了实现这一点,我必须为每个关系添加两行

另一方面,这是双向的:

SELECT friend.uid
FROM `user` 
JOIN friends ON user.uid IN(friends.col1, friends.col2)
JOIN user AS friend ON
  friend.uid IN(friends.col1, friends.col2)
WHERE user.uid = $user_id AND friend.uid != user.uid
但是这是利用多个
IN()
s不是很干净,可能会带来很大的性能影响


还有其他方法吗?

您只需使用
UNION ALL
并完全跳过连接,例如

SELECT friends.col1 friend_uid FROM friends WHERE friends.col2 = $user_id
UNION ALL
SELECT friends.col2            FROM friends WHERE friends.col1 = $user_id

您能展示一下表格模式和示例数据输入和输出吗?@JV这确实取决于rdbms,但是与
UNION
相比,
UNION
是一个相当简单的操作。啊,我明白了。我想象性能等级奇怪地给出了一大组表,但我一开始没有一大组表。如果我想从用户表中获得更多关于好友的数据,这会对性能产生怎样的影响?