SQL 声明复杂的 INNER JOIN

SQL statement complicated INNER JOIN

在我的数据库中我有两个 tables:

user, columns: id, username
friends, columns: this_friend_id, that_friend_id  

在我的网站上,用户可以互相发送好友请求,当一个用户接受另一个用户的好友请求时,在 friends table 中创建一个 ID 为this_friend_id 列中发送请求的用户,that_friend_id 列中的另一个条目是接受好友请求的用户。

当用户登录页面时,用户应该能够看到table中的所有用户,以及所有用户以及he/she是否是[=31]的好友=] 或不。但是我无法完成第二件事。登录用户是在 his_friend_id 列还是在 that_friend_id 列应该无关紧要。

我要select所有好友的用户。

这是我目前尝试过的方法: (出于演示目的,我为用户选择了 id = 3)

SELECT user.id, friends.this_friend_id, friends.that_friend_id
FROM friends
WHERE friends.this_friend_id = 3 OR friends.that_friend_id = 3
INNER JOIN user
ON friends.this_friend_id = user.id OR friends.that_friend_id = user.id;

我做错了什么?

WHERE 子句 JOIN 子句之后:

SELECT user.id, friends.this_friend_id, friends.that_friend_id
FROM friends
INNER JOIN user
ON friends.this_friend_id = user.id OR friends.that_friend_id = user.id
WHERE friends.this_friend_id = 3 OR friends.that_friend_id = 3;

所以你弄错了运算符的顺序。简单查询的运算符顺序应该是:

  • SELECT
  • 来自
  • 加入
  • 哪里
  • 订购

所以您的查询将变成:

SELECT user.id, friends.this_friend_id, friends.that_friend_id 
FROM friends 
INNER JOIN user 
ON friends.this_friend_id = user.id 
OR friends.that_friend_id = user.id;
WHERE friends.this_friend_id = 3 
OR friends.that_friend_id = 3

但是使用 or 语句不是很好,因为它会导致对表进行全面扫描。如果您想创建一个性能更高的脚本,您可以执行以下操作,您可以在其中使用 union 语句而不是 or 来获取 this_friend_id 和 that_friend_id join.

SELECT user.id, friends.this_friend_id, friends.that_friend_id 
FROM [friends] 
INNER JOIN [user] 
ON friends.this_friend_id = user.id 
WHERE friends.this_friend_id = 3 
union
SELECT user.id, friends.this_friend_id, friends.that_friend_id 
FROM [friends] 
INNER JOIN [user] 
ON friends.that_friend_id = user.id 
WHERE friends.that_friend_id = 3