Могу предложить три варианта:
1) Делаем все одним запросом, что-то типа:
SELECT product_id
FROM PropertyPivot
WHERE property_id IN (...) AND option_id IN (...)
GROUP BY product_id
HAVING count(*) = количество параметров поиска
2) Последовательный отсев кандидатов по каждому параметру. Например, пришел поиск по трем параметрам. Мы сначала делаем выборку по одному параметру, сохраняем промежуточные данные, затем делаем выборку по промежуточным данным по второму параметру и т.д.
3) Самый, как мне кажется, изощренный вариант. Строим pivot-таблицу по параметрам поиска, соединяем ее с таблицей товаров по product_id, вешаем условие и сохраняем запрос...