に参加だから私は3つのテーブルがあります。基本的な多対多の左には、クエリ
- ユーザー
- 成果 (多対多)achievements_unlocked
を私は希望利用可能なすべての成果を返し、現在のユーザー(例えばid_user = 123など)の成果がロック解除されていることを示します。
どうすればいいですか?これはLEFT JOINを必要とするはずですが、「WHERE id_user = 123」を追加すると、ロックされた成果が得られません。
ありがとう!
に参加だから私は3つのテーブルがあります。基本的な多対多の左には、クエリ
を私は希望利用可能なすべての成果を返し、現在のユーザー(例えばid_user = 123など)の成果がロック解除されていることを示します。
どうすればいいですか?これはLEFT JOINを必要とするはずですが、「WHERE id_user = 123」を追加すると、ロックされた成果が得られません。
ありがとう!
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カラムにインデックスを持っていることを確認してください。
これはおそらく、実行計画にネストされたループとハッシュのマッチングを行うことなく、これを行うための最も効率的な方法になります。この
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
書き込み時に機能しません。それは基本的に "そしてusers.user_id = 123"を無視しました。私は「と」を「持っている」と置き換えました、そして、今はうまくいくようです。たとえそれが効果的ではないとしても、私はそれがトリックだと思います!ありがとう – Etienne