我有三个表人,职位, jobs_persons
一个人可以拥有多个职位。
第1人是技术支持和经理
第2人是技术支持
第3人是经理
工作1 技术支持
工作2 经理
我需要查找查询,向我提供当前为技术支持和经理
的人员的结果答案只有人1
SELECT persons.*
FROM persons INNER JOIN jobs_persons ON persons.id = jobs_persons.person_id
INNER JOIN jobs ON jobs.id = jobs_persons.job_id
WHERE job.id IN (1,2)
返回3行
SELECT persons.*
FROM persons INNER JOIN jobs_persons ON persons.id = jobs_persons.person_id
INNER JOIN jobs ON jobs.id = jobs_persons.job_id
WHERE job.id = 1 AND job.id = 2
返回0行。
我目前正在开发Ruby on Rails。 有人可以帮忙吗?
答案 0 :(得分:2)
您想使用OR
运算符。使用job.id = 1 AND job.id = 2
只返回id等于1且同时为2的元素。没有元素可以做到这一点。你想要一个id为1或id为2的元素。
使其更加明显:
SELECT * FROM table WHERE lastname = 'Smith' AND firstname = 'James';
执行此操作时,您显然不希望所有被称为史密斯或詹姆斯的人。 ; - )
编辑:
误读了这个问题。你需要的是第二次加入工作表两次加入并加入他们与不同的工作。你没有展示架构有点困难,但这可能有用:
SELECT persons.*
FROM persons
INNER JOIN jobs_persons jp1 ON persons.id = jp1.person_id
INNER JOIN jobs_persons jp2 ON persons.id = jp2.person_id
INNER JOIN jobs j1 ON j1.id = jp1.job_id
INNER JOIN jobs j2 ON j2.id = jp2.job_id
WHERE j1.id = 1 AND j2.id = 2
答案 1 :(得分:2)
尝试此操作以获取在关联实体表中获得1 AND 2作业的所有人。无需点击工作表。
SELECT p.*
FROM persons p
WHERE id in (
SELECT person_id FROM jobs_persons
WHERE job_id IN (1,2)
GROUP BY person_id
HAVING COUNT(*) = 2
);
根据您最近的评论,您似乎遇到了性能问题。这真的超出了这个问题和答案的范围。
您需要确保您的索引位于相应的列上: