2017-04-03 7 views
2

このテーブルを自分自身に参加させて、2人のユーザーが両方ともフレンドリクエストを受け入れたかどうかを確認するにはどうすればよいですか?自分自身にテーブルに参加する

mysql> select * from friendships; 
+---------+-----------+----------+ 
| user_id | friend_id | accepted | 
+---------+-----------+----------+ 
|  1 |   2 |  1 | 
|  2 |   1 |  0 | 
|  3 |   1 |  1 | 
|  1 |   3 |  1 | 
|  1 |   4 |  1 | 
|  4 |   1 |  0 | 
|  5 |   1 |  1 | 
|  1 |   5 |  0 | 
+---------+-----------+----------+ 
8 rows in set (0.00 sec) 

また、ユーザーオブジェクトを引き出します。

user 1に未処理のフレンドリクエストがあるかどうかを確認できます。

mysql> select * from friendships join users on friendships.friend_id = users.id where friendships.user_id = 1 and accepted = false; 
+---------+-----------+----------+----+------------+----------+--------------------+------------------+-----------------+ 
| user_id | friend_id | accepted | id | fullName | username | phone    | verificationCode | accountVerified | 
+---------+-----------+----------+----+------------+----------+--------------------+------------------+-----------------+ 
|  1 |   5 |  0 | 5 | Tom Tester | tom  | +16502222222222222 | 4444    |    1 | 
+---------+-----------+----------+----+------------+----------+--------------------+------------------+-----------------+ 
1 row in set (0.00 sec) 

しかし、どのように、私は彼の受け入れ要求を(すなわちuser 1user 3の両方が要求を受け入れた)のですか?

また、バックグラウンドでユーザーテーブルを設定しています。

EDITは:私のスキーマが、それはトリックがuser_idfriend_idフィールドの組み合わせは、あなたの友情のテーブルの主キーとして機能していることである

CREATE TABLE friendships (
    user_id int, 
    friend_id int, 
    accepted boolean not null default false, 
    UNIQUE KEY friend (user_id, friend_id) 
); 
+0

あなたが作るためにあなたのテーブルの主キーを持っている必要がありますすることは –

+0

私の知る限り、あなたのテーブルにありませんどの作業に参加しますそれがフレンドシップテーブルの標準スキーマです。 – ARMATAV

+1

テーブルのエイリアスを使用すると、自分と結合することができます。次のようなものがあります:SELECT * FROM friendships JOIN friendships AS逆リバースON reverse.friend_id = friendships.user_id –

答えて

2

場合に役立ちます、これらは2つのフィールドは、テーブルに参加する必要がありますそれ自体で明らかに、ジョイン基準では、2つのレコードでロールが逆になるため、2つのフィールドを相互参照する必要があります。

select * 
from friendships f1 
inner join friendships f2 on f1.user_id=f2.friend_id and f1.friend_id=f2.user_id 
where f1.accepted=1 and f2.accepted=a1 and f1.user_id=... 

ます。またexistsサブクエリを使用して同じ出力を達成することができます:予想通り

select * from friendships f1 
where f1.user_id=... and f1.accepted=1 
    and exists (select 1 from friendships f2 
       where f2.user_id=f1.friend_id and f1.friend_id=f1.user_id and f2.accepted=1) 
+0

あなたは神様です。私は、私がやっていたことを思い描いていて、混乱していました。他のテーブルで比較されているテーブルでしか作業していません。ありがとう、相棒!また、最初の例では、 'f2.accepted = a1'は' f2.accepted = 1'または '= true'でなければなりません - 追加の' a'文字があります。 <3 – ARMATAV

+0

また、補完のために、正面に 'f1.friend_id = users.id'の右側に' join users users 'がなければなりません。これは、質問の「ユーザーオブジェクトをプルする」部分を解決します。D – ARMATAV

関連する問題