2011-04-13 99 views
0

我有三个表。技能(id),用户(id)和user_skills(user_id,skill_id)。根据3个表的外部联接

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

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行,其中包括技能信息以及用户信息,如果用户具有该技能。否则,此信息将为空,但所有技能信息将在那里。

我该如何做这样的查询?

回答

3
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。这可以确保您获得该特定用户的技能以及他还没有的技能。

+0

thanx!这将做到这一点。 BlorgBeard,thanx也是如此。都upvoted,不得不选择一个:) – Spyros 2011-04-13 07:06:48

3

把USER_ID检查的加入应该做的伎俩:

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

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

+0

因为这种方式不起作用:为什么user_skills.user_id = skills.id? :) – Marco 2011-04-13 06:57:08

+0

对不起,它可以这样写。 skills.id = Users.id – 2011-04-13 06:59:16

+0

我以为是错的,对不起:) – Marco 2011-04-13 07:00:59