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
在我的数据库中我有两个 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