2
所以我有3個表:基本許多一對多左連接查詢
- 用戶
- 成就
- achievements_unlocked(許多一對多)
我想一個查詢以返回所有可用的成就,並提及當前用戶(例如,id_user = 123)已解鎖的成就。
我該怎麼做?這應該涉及一個左連接,但如果我添加「WHERE id_user = 123」它不會讓我成就鎖定...
謝謝!
所以我有3個表:基本許多一對多左連接查詢
我想一個查詢以返回所有可用的成就,並提及當前用戶(例如,id_user = 123)已解鎖的成就。
我該怎麼做?這應該涉及一個左連接,但如果我添加「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