2012-04-03 15 views
1

私はユーザーとゲームを持つデータベースを持っています。 1ゲームには複数のユーザーがいるので、私はusers_gamesというリンクテーブルを作った。要するに、ゲームはボードゲームなので常に2人のプレイヤーしか持てないということです。私はどのプレイヤーを知っていますか、私は自分のuser_idと私のメールを持っていますが、私はuser_idと他の同僚の電子メールを持っているすべてのゲームのリストを私に提供したいと思います。つまり、私が入っているすべてのゲームを見て、もう1つの行にプレイヤーの名前を付けるクエリです。結合されたjquery結果のWHERE句の反対側の行を選択してください

マイテーブル:

ゲーム

id (int) 
board (varchar) representation of the board 

ユーザー

id (int) 
email (varchar) 
password (varchar MD5) 

users_games

明確にするため

このクエリ

SELECT * 
     FROM `tic_users_games` AS ug 
     LEFT JOIN tic_users AS u 
     ON ug.user_id = u.id 
     RIGHT JOIN tic_games AS g 
     ON ug.game_id = g.id 

そして

id user_id  game_id  id email password id board created  updated 

1 1 1 1 [email protected] d56b699830e77ba53855679cb1d252da 1 0|0|0|0|0|0|0|0|0 2012-04-02 16:56:06  2012-04-02 16:56:06 
2 2 1 2 [email protected] d56b699830e77ba53855679cb1d252da 1 0|0|0|0|0|0|0|0|0 2012-04-02 16:56:06  2012-04-02 16:56:06 
3 3 2 2 [email protected] d56b699830e77ba53855679cb1d252da 2 0|0|0|0|0|0|0|0|0 2012-04-02 16:56:06  2012-04-02 16:56:06 
4 1 2 1 [email protected] d56b699830e77ba53855679cb1d252da 2 0|0|0|0|0|0|0|0|0 2012-04-02 16:56:06  2012-04-02 16:56:06 

参照の結果:上記のケースで、私はちょうど2行たい:game_id 1および2、FOE1と@ ...とFOE2を@ ...

おかげ

+2

だけマイナーなものが、 'FOE2 @ gmail.com'が '3'のような異なる' user_id'を持つべきではありませんか?以下は、あなたがテストできるスキーマの設定です:http://www.sqlfiddle.com/#!2/7b0f6 – mellamokb

+0

あなたは正しい相手です...私はプライバシーの目的でemailaddressesを変更しました。 Gr。 –

答えて

2

これはあなたのためにそれを行う必要があります。この構文はmysqlでは正確ではないかもしれませんが、そこに入るべきです。 (、@useridはあなたがゲームを検索しているユーザーを表し、この場合は、1)

SELECT 
    User_Games.Game_ID, 
    Users.ID, 
    Users.Email 
FROM 
    Users 
    LEFT JOIN User_Games ON Users.ID = User_Games.User_Id 
WHERE 
    Users.User_ID <> @yourUserID 
AND EXISTS 
    (SELECT 
     NULL 
    FROM 
     User_Games AS MyUserGames 
    WHERE 
     User_Games.Game_ID = MyUserGames.Game_ID 
    AND MyUserGames.User_ID = @yourUserID) 
+3

また、現在のユーザーを除外するには、最後に 'AND Users.id <> @ yourUserID'が必要です。http://www.sqlfiddle.com/#!2/7b0f6/7 – mellamokb

+0

@mellamokb - 本当にありがとうございます。今編集、ありがとう – Tobsey

+0

ありがとう、魅力のように動作します! –

2

これを試してみてください:基本的に私は午前のゲームと同じgame_IDでuser_gamesテーブルでゲームを持っているすべてのユーザーが得ます:

select * 
     from tic_users_games ug1 
left join tic_users_games ug2 on ug1.game_id = ug2.game_id 
left join tic_users u   on ug2.user_id = u.id 
right join tic_games g   on ug2.game_id = g.id 
    where ug1.user_id = @userid 
     and ug2.user_id <> @userid 

デモ:http://www.sqlfiddle.com/#!2/7b0f6/2

+0

ヘヤマイト、これは本当にうまくいくようです。 2 ug2の背後にあるあなたのアイデアは本当にわからないのですか?それは驚くべきことですが、少し私には不明です、あなたは詳細を教えてくださいできますか?そして、フィドルで素晴らしい仕事! –

+2

@ HansWassink - user_gamesテーブルには、1ゲームあたり2行、Meは1、Himは1行あります。 game_idに基づいて自分自身に参加すると、4行になります。 MeMe、MeHim、HimMe、HimHim。 where節を見てください。最初の句は、私がユーザーである最初のuser_gamesの行のみを示します。これにより、MeMeとMeHimだけが残されます。次に、2番目のwhere句は、私が右の表にいるときに行を削除し、MeMeを削除します。これはMeHimを含む行だけを残し、彼の詳細はug2で残します。その後、ユーザーの詳細についてユーザーにこれを参加させ、最後にゲームの詳細についてゲームに参加させます。とても良いアイデアです。 – Tobsey

+0

@Tobsey:良い説明:)実行計画を比較すると、あなたのメソッドは少し効率的に見えます。 – mellamokb

関連する問題