mariadb SQL语句复杂INNER JOIN [已关闭]

nnsrf1az  于 2022-11-23  发布在  其他
关注(0)|答案(2)|浏览(144)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
6个月前关闭。
Improve this question
在我的数据库中有两个表:

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

在我的网站上,用户可以互相发送好友请求,当一个用户接受另一个用户的好友请求时,friends表中的一个条目在this_friend_id列中包含发送请求的用户的id,另一个条目在that_friend_id列中包含接受好友请求的用户。
当一个用户登录到页面时,该用户应该能够看到一个表中的所有用户,包括所有用户以及他/她是否是他/她的朋友。但是我无法完成第二件事。登录的用户是在his_friend_id列还是在that_friend_id列中应该没有关系。
我想选择用户的所有好友。
以下是我目前所尝试的方法:(出于演示目的,我为用户选择了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;

我做错了什么?

p4tfgftt

p4tfgftt1#

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;
ylamdve6

ylamdve62#

因此,您的运算符顺序是错误的。一个简单查询的运算符顺序应该是:

  • 选择
  • 加入
  • 地点
  • 订单

因此,您的查询将变成:

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联接。

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

相关问题