2012-01-25 60 views
0

我有两个表:工作和job_industries(加入jobs.id=job_industries.job_id)。 我想找到与jobs.title like '%Finance%'和没有job_industries.industry=1每个工作。一对多关系的多方面过滤

但是,当运行下面的查询时,我会得到与标题条件相匹配的每个作业的列表,并且至少有一个行业选项不是1

select jobs.id, title, industry 
from `job_industries` 
left join jobs on jobs.id=`job_industries`.job_id 
where is_live=1 and jobs.`is_closed`=0 and 1 in (select industry from job_industries where job_id in) 

例如,如果某个作业有两个job_industry关系(industry=1industry=2),则该作业将与该查询匹配。我更喜欢找不到的工作。

回答

4
SELECT j.id, j.title, ji.industry 
    FROM jobs j 
     INNER JOIN job_industries ji 
      ON j.id = ji.job_id 
       AND ji.industry <> 1 
    WHERE j.title LIKE '%Finance%' 
     AND j.is_live = 1 
     AND j.is_closed = 0 
     AND NOT EXISTS (SELECT 1 
          FROM job_industries ji2 
          WHERE ji2.job_id = j.id 
           AND ji2.industry = 1); 

或者,你可以这样做,而不是:

SELECT j.id, j.title, ji.industry 
    FROM jobs j 
     INNER JOIN job_industries ji 
      ON j.id = ji.job_id 
       AND ji.industry <> 1 
     LEFT JOIN job_industries ji2 
      ON j.id = ji2.job_id 
       AND ji2.industry = 1 
    WHERE j.title LIKE '%Finance%' 
     AND j.is_live = 1 
     AND j.is_closed = 0 
     AND ji2.job_id IS NULL; 
+0

只有一个校正I /想/你应该做。你正在使用 - 而不是=。我转换为=,它似乎运作良好。谢谢! – Devin

+1

@Devin你是对的。我会解决这个问题。诅咒我胖胖的手指! –

0
select jobs.id, title, industry 
from `job_industries` 
left join jobs on jobs.id=`job_industries`.job_id AND job_industries.industry=1 
where is_live=1 and jobs.`is_closed`=0 and job_industries.industry IS NULL