现在我刚开始进入联接,所以我可能错过了对它的一些核心理解,但这就是我想做的事情:
我有一个包含个人资料的表格,以及一些包含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)
最后一行是造成问题的原因。任何帮助表示赞赏。
另外,我以前从未在这里发帖,所以我不知道我在做什么 感谢
答案 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)