[英]SQL find records based on two columns
给定一个主表为id
的用户表,我有一个名为friends
userid1, userid2
该表只有两个字段( userid1, userid2
)。 这使我们可以在不同用户之间创建任何类型的关系(一对多,一对一等)。 用户可以出现在任一列中,并且两列相等。 IOW,每个关系一个条目。
如何提取给定用户id
所有朋友。 说乔尼(Jonny),有3个朋友,他的用户id
是16
...我的SQL查询应该像这样吗?
SELECT *
FROM db.users
JOIN db.friends
ON db.users.id = db.friends.userid1
AND db.users.id = 16
希望这很清楚。 另外,如果可能,我可以从结果集中排除Jonny吗?
列出的该查询使我了解以下内容:
id name uuid birthday userid1 userid2
16 jonny ABCDEFGHIJKLMNOP 1967-04-27 01:00:00 1 2
16 jonny ABCDEFGHIJKLMNOP 1967-04-27 01:00:00 1 3
这很接近,除了我要他的朋友,而不是乔尼
谢谢大家,所以我感谢您。 这是最终的工作查询。
SELECT *
FROM db.users
WHERE db.users.id IN
(
SELECT db.friends.userid2 as id FROM db.friends WHERE db.friends.userid1 = 16
union
SELECT db.friends.userid1 as id FROM db.friends WHERE db.friends.userid2 = 16
)
这给了我:
id name uuid birthday
2 robin ABCDEFGHIJKLMNOP 1967-04-27 01:00:00
3 gary ABCDEFGHIJKLMNOP 1967-04-27 01:00:00
最后将user.id
的条件添加到where
子句中:
Select * From users
INNER JOIN friends on
users.id = friends.userid1
Where users.id = 16
另外,我将使用Inner Join
,仅当friends
中有匹配项时,才会从users
返回所有记录
您可以执行以下子查询:
SELECT *
FROM users
WHERE id IN
(
SELECT userid2 as id FROM db.friends WHERE userid1 = 16
)
您应该过滤好友表,而不是用户表。
SELECT friends.*
FROM friends
INNER JOIN users
ON friends.userid2 = users.id
WHERE friends.userid1 = 16
如果您只需要朋友ID,那么根本没有理由加入
SELECT userid2
FROM friends
WHERE userid1 = 16
您需要一个朋友ID列表:
SELECT U FROM DB.USERS U WHERE U.ID IN ( SELECT F.USERID2 FROM DB.FRIENDS F WHERE F.USERID1 = 16)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.