Mysql MySQL: GROUP BY и IN

carte_noire

Новичок
Здравствуйте, уважаемые.
Возникла у меня проблема при переделке модели (catalog/.../product.php) для openCart 2.*.
Дело касается фильтров.
Вот есть запрос:
Код:
SELECT p.product_id, pf.filter_id
FROM oc_product_to_category p2c
LEFT JOIN oc_product_filter pf ON (p2c.product_id = pf.product_id)
... // JOIN-ы еще
WHERE p2c.category_id = CATEGORY_ID
ORDER BY p.sort_order ASC
И получается таблица
Код:
product_id:filter_id
113    3
113    29
113    35
113    40
-----
112    13
112    29
112    35
112    40
-----
Как видно, есть дубли, поэтому Opencart делает вот так:
Код:
SELECT p.product_id, pf.filter_id
FROM oc_product_to_category p2c
LEFT JOIN oc_product_filter pf ON (p2c.product_id = pf.product_id)
... // JOIN-ы еще
WHERE p2c.category_id = CATEGORY_ID
GROUP BY p.product_id //Группировка (агрегация)
ORDER BY p.sort_order ASC
Получается:
Код:
product_id:filter_id
113    3
112    13
То есть все это сжалось.
А теперь для поиска по фильтрам используется вот эта конструкция:
Код:
SELECT p.product_id, pf.filter_id
FROM oc_product_to_category p2c
LEFT JOIN oc_product_filter pf ON (p2c.product_id = pf.product_id)
... // JOIN-ы еще
WHERE 
    p2c.category_id = CATEGORY_ID 
    AND pf.filter_id IN (id_фильтра_1, id_фильтра_2, ...) //IN поехал
GROUP BY p.product_id
ORDER BY p.sort_order ASC
И он ищет по этим сгруппированным ID фильтров. Получается, что они при группировке не теряются, а в кучу собираются и IN по ним ищет.
Но IN выдает TRUE когда хотя бы один ID-шник из заданного набора совпадает. То есть это логическое ИЛИ.

ВОПРОС:
Как сделать, чтобы проверка велась по правилу И, то есть, чтобы TRUE было только когда все элементы из набора есть в наборе filter_id у продукта.
То есть, чтобы
AND pf.filter_id IN (id_фильтра_1, id_фильтра_2, ...)

давало TRUE только когда id_фильтра_1и id_фильтра_2 есть у проверяемого элемента.
 

WMix

герр M:)ller
Партнер клуба
AND pf.filter_id IN (id_фильтра_1, id_фильтра_2, ...) //IN поехал
AND count(pf.filter_id) = Количество id_фильтра
 

carte_noire

Новичок
@WMix, выдает
Код:
Ошибка в запросe (1111): Invalid use of group function
Делаю так:
Код:
AND pf.filter_id IN (40,2)
AND count(pf.filter_id) = 2
UPD:
Вроде работает
Код:
HAVING COUNT(pf.filter_id) = COUNT_FILTER
П.С.
Спасибо, @WMix
 
Последнее редактирование:
Сверху