Фильтр по многим сторонам отношений «один ко многим» - PullRequest
0 голосов
/ 26 января 2012

У меня есть две таблицы: jobs и 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=1 и industry=2), тогда это задание будет соответствовать запросу.Я предпочел бы найти работу, которая не.

Ответы [ 2 ]

4 голосов
/ 26 января 2012
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 голосов
/ 26 января 2012
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
...