1

给定一个主键为 的用户表id,我有一个名为的外部表friends,它只有两个字段 ( userid1, userid2)。这允许我们在不同用户之间创建任何类型的关系(一对多、一对一等)。用户可以出现在任一列中,并且两列相等。IOW,每个关系一个条目。

我怎样才能拉出给定用户id拥有的所有朋友。说 Jonny,有 3 个朋友,他的用户id16……我的 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
4

4 回答 4

2

你可以做一个子查询,如:

SELECT * 
FROM users
WHERE id IN
(
  SELECT userid2 as id FROM db.friends WHERE userid1 = 16
)
于 2013-04-16T19:10:49.093 回答
1

您应该过滤朋友表,而不是用户表。

SELECT friends.*
FROM friends
INNER JOIN users
  ON friends.userid2 = users.id
WHERE friends.userid1 = 16

如果您只需要朋友ID,那么根本没有理由加入

SELECT userid2
FROM friends
WHERE userid1 = 16
于 2013-04-16T19:12:39.443 回答
1

您需要一个朋友 ID 列表:

SELECT U FROM DB.USERS U WHERE U.ID IN ( SELECT F.USERID2 FROM DB.FRIENDS F WHERE F.USERID1 = 16)

于 2013-04-16T19:12:47.083 回答
1

user.id在您的where子句末尾添加条件:

Select * From users
INNER JOIN friends on
users.id = friends.userid1
Where users.id = 16

另外,我会使用一个Inner Join它将users仅从匹配的地方返回所有记录friends

于 2013-04-16T19:09:58.007 回答