【问题标题】:Outer Join based on 3 tables基于 3 个表的外连接
【发布时间】:2011-04-13 06:50:49
【问题描述】:

我有三张桌子。 Skills(id)、Users(id) 和 user_skills(user_id, Skill_id)。

现在,我尝试左外连接,例如:

select * from skills left outer join user_skills ON skills.id = user_skills.skill_id;

但它不会带回我需要的东西,因为没有检查用户 ID。 如果我这样做:

select * from skills left outer join user_skills ON skills.id = user_skills.skill_id where user_skills.user_id = 986759322;

我根据特定的用户 ID 取回一条记录。

但是,我想取回某个用户的所有技能,无论该用户是否发现了该技能。所以,如果技能是 4,我想要返回 4 行,其中包括技能信息以及如果用户具有该技能的用户信息。如果没有,则此信息将为空,但所有技能信息都会存在。

我怎样才能进行这样的查询?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    SELECT skills.id, IF(IS NULL user_skills.skill_id, 'Yes', 'No')
    FROM skills
    LEFT JOIN user_skills ON (
        skills.id = user_skills.skill_id AND 
        user_skills.user_id = 1234
    )
    

    请注意,按用户 ID 进行过滤是在 ON 子句中进行的,而不是在 WHERE 中。这可以保证您获得该特定用户的技能以及他还没有的技能。

    【讨论】:

    • 谢谢!这样就可以了。 BlorgBeard,谢谢。两者都赞成,必须选择一个:)
    【解决方案2】:

    将 user_id 检查放入连接中应该可以解决问题:

    select * from skills 
    left outer join user_skills 
      on skills.id = user_skills.skill_id
     and user_skills.user_id = 123   
    

    【讨论】:

      【解决方案3】:

      为什么你不能写这样的查询select * from skills left outer join user_skills ON skills.id = user_skills.skill_id where user_skills.user_id = skills.id;

      【讨论】:

      • 因为这种方式行不通:为什么 user_skills.user_id = Skills.id?? :)
      • 对不起,可以这样写。 Skills.id=Users.id
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多