我如何构建此JOIN语句?遇到条件问题

时间:2012-09-06 14:04:22

标签: mysql search join

现在我刚开始进入联接,所以我可能错过了对它的一些核心理解,但这就是我想做的事情:

我有一个包含个人资料的表格,以及一些包含profile_id,一些不相关数据和一个value_id(一对一关系)的表格(角色,技能,标题等)

用户将输入一个不同value_ids的数组,我想检索具有相应表的所有配置文件的id,其value_id与我们从用户检索的值匹配。

输入中的某些值被指定为仅匹配某个表(在这种情况下为角色和行业),并且该部分现在正在运行。但是,我不能做的是检查相关表格的任何是否匹配。


我不知道如何设置这个sql块的样式。抱歉。编辑:它自称风格。整洁。
在这个例子中,我有三个值。指定一个(88)来​​搜索某个角色,一个用于行业(128),第三个(73)必须匹配一组表中的至少一行。

SELECT DISTINCT(profiles.id) as id,  
FROM profiles  
INNER JOIN profile_experience_roles r ON(r.profile_id = profiles.id)  
INNER JOIN profile_experience_industries i ON(i.profile_id = profiles.id)  
INNER JOIN profile_experience_technology t ON(t.profile_id = profiles.id)  
INNER JOIN profile_wanted_roles w ON(w.profile_id = profiles.id)  
INNER JOIN profile_languages l ON(l.profile_id = profiles.id)   
WHERE r.value_id = 88 AND i.value_id = 128 AND  
(r.value_id = 73 OR i.value_id = 73 OR t.value_id = 73 OR w.value_id = 73 OR l.value_id = 73)

最后一行是造成问题的原因。任何帮助表示赞赏。

另外,我以前从未在这里发帖,所以我不知道我在做什么 感谢

2 个答案:

答案 0 :(得分:1)

尝试

WHERE r.value_id = 88 AND i.value_id = 128 AND 
73 IN (r.value_id, i.value_id, t.value_id, w.value_id, l.value_id)

在您的情况下,您应该可以使用

WHERE r.value_id = 88 AND i.value_id = 128 AND 
73 IN (t.value_id, w.value_id, l.value_id)

由于r.value_id永远不会是88 73. i.value_id同样不能是128 73。

请注意,INNER JOIN要求在这些表的所有之间建立连接以获取任何行。

答案 1 :(得分:1)

关于联接差异的一个很好的例子是:What is the difference between "INNER JOIN" and "OUTER JOIN"?

内部联接可能是原因。您可能正在加入不存在的ID,并且未返回所有数据。我还包括Robin对IN进行的更改以及删除r.value和i.value

试试这个:

SELECT 
    DISTINCT(profiles.id) as id,  
FROM profiles  
RIGHT JOIN profile_experience_roles r ON(r.profile_id = profiles.id)  
RIGHT JOIN profile_experience_industries i ON(i.profile_id = profiles.id)  
RIGHT JOIN profile_experience_technology t ON(t.profile_id = profiles.id)  
RIGHT JOIN profile_wanted_roles w ON(w.profile_id = profiles.id)  
INNER JOIN profile_languages l ON(l.profile_id = profiles.id)   
WHERE profiles.id is not null AND r.value_id = 88 AND i.value_id = 128 AND 
    73 IN (t.value_id, w.value_id, l.value_id)