2011-12-04 53 views
2

所以我有3個表:基本許多一對多左連接查詢

  • 用戶
  • 成就
  • achievements_unlocked(許多一對多)

我想一個查詢以返回所有可用的成就,並提及當前用戶(例如,id_user = 123)已解鎖的成就。

我該怎麼做?這應該涉及一個左連接,但如果我添加「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