我有三张桌子,persons,jobs,jobs_persons
一个人可以拥有多个作业。
Person 1是技术支持和经理
Person 2是技术支持
Person 3是经理
工作1技术支持
工作2管理器
我需要找到一个查询,给我目前技术支持和经理的结果
答案只能是第一人
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行.
我目前正在研究Rails。有人能帮忙吗?
发布于 2011-09-17 16:43:47
您希望使用OR操作符。使用job.id = 1 AND job.id = 2只返回id等于1的元素,同时返回2,没有任何元素可以这样做。您想要在id为1或id为2的地方使用elemets。
为了使它变得更加明显:
SELECT * FROM table WHERE lastname = 'Smith' AND firstname = 'James';在执行此操作时,您显然不希望每个名为Smith或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发布于 2011-09-17 16:48:30
尝试这样做,以便在关联实体表中得到所有得到1和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
);根据你最近的评论,你的表现似乎有问题。这实际上超出了这个问题和答案的范围。
您需要确保索引在适当的列上:
https://stackoverflow.com/questions/7456279
复制相似问题