繁体   English   中英

基本的多对多左联接查询

[英]Basic many-to-many left join query

所以我有3张桌子:

  • 用户
  • 成就
  • 成就已解锁(多对多)

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

我怎样才能做到这一点? 这应该涉及一个左联接,但是如果我添加“ WHERE id_user = 123”,它将不会使我锁定成就。

谢谢!

尝试这个

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM