问题描述
|
我有三张桌子。技能(id),用户(id)和用户技能(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行,其中包括用户拥有该技能的技能信息以及用户信息。如果不是,该信息将为空,但是所有技能信息将在那里。
我该如何查询?
解决方法
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
子句中进行的。这样可以确保您获得该特定用户的技能以及他尚未拥有的技能。
,将user_id检查加入联接应该可以解决问题:
select * from skills
left outer join user_skills
on skills.id = user_skills.skill_id
and user_skills.user_id = 123
,你为什么不能写这样的查询select * from skills left outer join user_skills ON skills.id = user_skills.skill_id where user_skills.user_id = skills.id;