2011-12-04 10 views
2

に参加だから私は3つのテーブルがあります。基本的な多対多の左には、クエリ

  • ユーザー
  • 成果
  • (多対多)achievements_unlocked

を私は希望利用可能なすべての成果を返し、現在のユーザー(例えばid_user = 123など)の成果がロック解除されていることを示します。

どうすればいいですか?これはLEFT JOINを必要とするはずですが、「WHERE id_user = 123」を追加すると、ロックされた成果が得られません。

ありがとう!

答えて

2
Select * 
From achievements 
Left Outer Join achievements_unlocked On achievements_unlocked.achievement_id = achievements.achievement_id 
Left Outer Join users On 
    users.user_id = achievements_unlocked.user_id And 
    users.user_id = 123 

を試してみてください。あなたがそれらを含むすべてのテーブルのachievement_idとuser_idカラムにインデックスを持っていることを確認してください。

+0

書き込み時に機能しません。それは基本的に "そしてusers.user_id = 123"を無視しました。私は「と」を「持っている」と置き換えました、そして、今はうまくいくようです。たとえそれが効果的ではないとしても、私はそれがトリックだと思います!ありがとう – Etienne

3

これはおそらく、実行計画にネストされたループとハッシュのマッチングを行うことなく、これを行うための最も効率的な方法になります。この

SELECT ac.*, 
    CASE WHEN un.ach_id IS NULL THEN 0 
    ELSE 1 END AS user_unlocked 
FROM achievements ac 
    LEFT JOIN 
     (SELECT au.ach_id FROM achievements_unlocked au 
     INNER JOIN users u ON au.user_id = u.id 
     WHERE u.id = 123) un 
     ON ac.id = un.ach_id