基本的多对多左连接查询

时间:2011-12-04 21:53:30

标签: mysql

所以我有3张桌子:

  • 用户
  • 成就
  • achievement_unlocked(多对多)

我想查询返回所有可用的成就,并提及当前用户(例如id_user = 123)已解锁的成就。

我该怎么做?这应该涉及LEFT JOIN,但如果我添加“WHERE id_user = 123”,它将不会让我锁定成就......

谢谢!

2 个答案:

答案 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列上都有索引。