所以我有3张桌子:
我想查询返回所有可用的成就,并提及当前用户(例如id_user = 123)已解锁的成就。
我该怎么做?这应该涉及LEFT JOIN,但如果我添加“WHERE id_user = 123”,它将不会让我锁定成就......
谢谢!
答案 0 :(得分: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
答案 1 :(得分: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列上都有索引。