1

私は2つのテーブルを持っています:

「ユーザー」テーブル

id ユーザー名  
---- --------
0001 ユーザー1          
0002 ユーザー 2          
0003 ユーザー3          
0004 ユーザー4     

「フレンズ」テーブル

user_id フレンド_id フレンド
---------- ---------- ------
0001 0004 1
0002 0004 1
0005 0004 0

user4 の友達全員の名前を表示するにはどうすればよいですか? 友達テーブルの友達列の場合、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;

しかし、私が得るものは次のとおりです。

user1 と user2 の代わりに user4 と user4

私を助けることができますか?

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テーブルをfriend_idではなくuser_idのusersテーブルにリンクしたくないですか?次に、where句を変更して、user_idの代わりにfriend_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
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

select username from users us where us.id in ( select f.[user_id] from users u inner join friends f ON u.id = f.friend_id where f.friend=1)

于 2009-08-31T11:58:31.310 に答える
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 に答える
0

dmcgiv には、フレンド マッピングが双方向の場合に考慮する必要がある重要なポイントがあります (つまり、A が B とフレンドである場合、B は自動的に A とフレンドになります)。関心のあるユーザーが Friends テーブル マッピングの両側にいるかどうかを確認する必要があります。

dmcgiv の方法で行うか、別の方法として、友情を追加するときに両方向のリンクを [Friends] テーブルに挿入するだけです。たとえば、ユーザー 0004 がユーザー 0006 と友達である場合、Friends テーブルに次のように挿入します。

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

ちなみに、友達欄は必要ないと思います。「非フレンド」を追跡する何らかの理由がない限り、フレンドシップが終了した場合は、フレンド テーブルからマッピングを削除できます。

于 2009-02-25T03:14:19.893 に答える