carte_noire
Новичок
Здравствуйте, уважаемые.
Возникла у меня проблема при переделке модели (catalog/.../product.php) для openCart 2.*.
Дело касается фильтров.
Вот есть запрос:
И получается таблица
Как видно, есть дубли, поэтому Opencart делает вот так:
Получается:
То есть все это сжалось.
А теперь для поиска по фильтрам используется вот эта конструкция:
И он ищет по этим сгруппированным ID фильтров. Получается, что они при группировке не теряются, а в кучу собираются и IN по ним ищет.
Но IN выдает TRUE когда хотя бы один ID-шник из заданного набора совпадает. То есть это логическое ИЛИ.
ВОПРОС:
Как сделать, чтобы проверка велась по правилу И, то есть, чтобы TRUE было только когда все элементы из набора есть в наборе filter_id у продукта.
То есть, чтобы
AND pf.filter_id IN (id_фильтра_1, id_фильтра_2, ...)
давало TRUE только когда id_фильтра_1и id_фильтра_2 есть у проверяемого элемента.
Возникла у меня проблема при переделке модели (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
-----
Код:
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
Но IN выдает TRUE когда хотя бы один ID-шник из заданного набора совпадает. То есть это логическое ИЛИ.
ВОПРОС:
Как сделать, чтобы проверка велась по правилу И, то есть, чтобы TRUE было только когда все элементы из набора есть в наборе filter_id у продукта.
То есть, чтобы
AND pf.filter_id IN (id_фильтра_1, id_фильтра_2, ...)
давало TRUE только когда id_фильтра_1и id_фильтра_2 есть у проверяемого элемента.