С нестрогим поиском все понятно. Запрос с условием in () даст тебе все записи, где указаны соотв. типы. Т.е. нестрогий поиск будет выглядеть так:
Код:
select proposal_id
from devices
where sort_work_id in (:list)
group by proposal_id
Теперь по поводу строгого поиска.
Вариант 1. Когда нельзя ввести 2 заявки с одинаковыми proposal_id и sort_work_id.
Код:
select proposal_id
from devices
where sort_work_id in (:list)
group by proposal_id
having count(*) = :n
В чем суть. В запросе выбираюься записи с типм работ соотв. переданному в in списку, далее группируются по proposal_id и фильтруются по кол-ву. Т.е. если у тебя в списке 2 типа работ (помним, что этот вариант подразумевает, что для одной заявки оин тип работ может быть указан только один раз), то мы проверяем, что у нас всего 2 записи (ровно 2).
Теперь, если типы работ могут повторяться.
Фактически, мы сводим задачу к предыдущей путем "сворачивания" пары proposal_id/sort_work_id в уникальную комбинацию (ну и фильтр внутрь подзапроса перенесем для оптимизации):
Код:
select d.proposal_id
from
(
select distinct a.proposal_id, a.sort_work_id
from devices a
where a.sort_work_id in (:list)
) d
group by d.proposal_id
having count(*) = :n