1

我有 2 张桌子:

“用户”表

id 用户名  
---- --------
0001 用户1          
0002 用户2          
0003 用户3          
0004 用户4     

“朋友”表

user_idfriend_id 朋友
-------- --------- ------
0001 0004 1
0002 0004 1
0005 0004 0

如何显示所有 user4 朋友的姓名?如果在friends表的朋友列中,1表示他们是朋友,0表示他们仍然不是朋友。

我使用 INNER JOIN,如下所示:

SELECT users.username
FROM `users`
INNER JOIN `friends` ON users.id = friends.friend_id
WHERE friends.user_id = 0004
  AND friend = 1;

但我得到的是:

user4 和 user4 而不是 user1 和 user2

可以帮我?

4

10 回答 10

4
SELECT u.username
FROM   Friends f, Users u
WHERE  f.user_id = u.id
       AND f.friend = 1
       AND f.friend_id = '0004'
于 2009-02-24T10:13:33.670 回答
3
SELECT users.username
FROM `users`
INNER JOIN `friends` ON users.id = friends.user_id
WHERE friends.user_id = 0004
  AND friend = 1;
于 2009-02-24T09:58:35.967 回答
1
select u.username
from friends f, users u
where f.friend_id='0004' and f.friend=1 and f.id=u.user_id;

编辑:这与:

select u.username
from friends f inner join users u on f.id=u.user_id
where f.friend_id='0004' and f.friend=1;
于 2009-02-24T09:52:49.100 回答
1

您确定不想将friends 表链接到user_id 而不是friend_id 上的users 表吗?然后更改 where 子句以使用friend_id 而不是user_id。格式化连接有不同的方法,但使用内部连接的方式看起来不错。

SELECT users.username
FROM `users` 
INNER JOIN `friends` ON users.id = friends.user_id 
WHERE friends.friend_id = 0004   
AND friend =1
于 2009-02-24T10:06:12.797 回答
1

你的意思是这样吗?

SELECT u.username
FROM friends AS f
INNER JOIN users AS u USING user_id
WHERE f.friend_id = 0004 AND f.friend = 1
于 2009-02-24T10:15:43.710 回答
1
select U.Username
from
    Users as U
    inner join Friends as F on U.Id = F.user_id and F.friend = 1
where
    F.friend_id = '0004'

如果朋友表只是一个映射表,那么您不想双向映射吗?

select U.Username
from
    Users as U
    left outer join
    (
        select 
            F.user_id as Id
        from
            Friends as F
        where
            F.friend_id = '0004'
        and
            F.friend = 1

    ) as Mapping1 on Mapping1.Id = U.id
    left outer join
    (
        select 
            F.friend_id as Id
        from
            Friends as F
        where
            F.user_id = '0004'
        and
            F.friend = 1

    ) as Mapping2 on Mapping2.Id = U.id

where
    Mapping1.Id is not null or Mapping2.Id is not null
于 2009-02-24T10:26:27.850 回答
0

从用户 us 中选择用户名,其中 us.id 在(从用户中选择 f.[user_id] 加入好友 f ON u.id = f.friend_id where f.friend=1)

于 2009-08-31T11:58:31.310 回答
0
SELECT u.username
FROM Friends f, Users u
WHERE f.friend = 1 AND 
 ((f.friend_id = @userid AND f.user_id = u.id) OR
  (f.user_id = @userid AND f.friend_id = u.id))
于 2009-02-24T09:51:10.510 回答
0

dmcgiv 有一个重要的点,您需要考虑朋友映射是否是双向的(即,如果 A 与 B 成为朋友,则 B 自动与 A 成为朋友)。您需要检查您感兴趣的用户是否在 Friends 表映射的任一侧。

您可以按照 dmcgiv 的方式执行此操作,或者另一种方式是在添加友谊时将两个方向的链接插入到 Friends 表中。例如,如果用户 0004 是用户 0006 的朋友,您将在 Friends 表中插入:

user_id | friend_id | friend
0004    | 0006      |   1
0006    | 0004      |   1

顺便说一句,我不认为你真的需要朋友专栏。除非出于某种原因要跟踪“非朋友”,否则如果友谊结束,您可以从 Friends 表中删除映射。

于 2009-02-25T03:14:19.893 回答
0

试试这个查询

select u.username from users u join friends f on u.id=f.user_id  and f.friend=1;
于 2015-03-12T09:13:56.937 回答