Логика Работы По Фильтру Характеристики Флажекнесколько Работает Как Или А Нужно Как И

Неправильная логика работы по Фильтру Характеристики ФлажекНесколько Работает как ИЛИ а нужно как И.

У меня во флажек несколько интерфейсы монитора:

DVI

HDMI

VGA

Я хочу отобрать все мониторы с интерфейсом

DVI+HDMI

да + да

А в итоге получаю все мониторы любой комбнацией вхождния этих интерфейсов

DVI+HDMI

да + да

да + нет

нет + да

Нужна отдельная группировка и AND по каждому значению характеристики, както так:

AND (var_val_499.variant_id IN (6814, 6811)) -> AND (var_val_499_6814 is not null AND var_val_499_6811 is not null ))

SELECT SQL_CALC_FOUND_ROWS products.product_id, IF(shared_descr.product_id IS NOT NULL, shared_descr.product, descr1.product) as product, cscart_supplier_links.supplier_id FROM cscart_products as products LEFT JOIN cscart_product_features_values as var_val_499 ON var_val_499.product_id = products.product_id AND var_val_499.lang_code = 'ru' AND var_val_499.feature_id = 499 LEFT JOIN cscart_product_descriptions as descr1 ON descr1.product_id = products.product_id AND descr1.lang_code = 'ru' LEFT JOIN cscart_product_prices as prices ON prices.product_id = products.product_id AND prices.lower_limit = 1 INNER JOIN cscart_products_categories as products_categories ON products_categories.product_id = products.product_id INNER JOIN cscart_categories ON cscart_categories.category_id = products_categories.category_id AND (cscart_categories.usergroup_ids = '' OR FIND_IN_SET(0, cscart_categories.usergroup_ids) OR FIND_IN_SET(1, cscart_categories.usergroup_ids)) AND cscart_categories.status IN ('A', 'H') LEFT JOIN cscart_ult_product_descriptions shared_descr ON shared_descr.product_id = products.product_id AND shared_descr.company_id = 1 AND shared_descr.lang_code = 'ru' LEFT JOIN cscart_supplier_links ON cscart_supplier_links.object_id = products.product_id AND cscart_supplier_links.object_type = 'P' WHERE 1 AND (var_val_499.variant_id IN (6814, 6811)) AND cscart_categories.category_id IN (7337) AND cscart_categories.company_id = 1 AND (products.usergroup_ids = '' OR FIND_IN_SET(0, products.usergroup_ids) OR FIND_IN_SET(1, products.usergroup_ids)) AND products.status IN ('A') AND prices.usergroup_id IN (0, 0, 1) GROUP BY products.product_id ORDER BY NULL asc LIMIT 0, 12

p.s. Пытался разобраться в вашей fn.catalog.php это жжесть в плане фильтра :)

Ну, например, откроем всем известный и ненуждающийся в рекламе

http://www.eldorado.ru/cat/1482093/

Там есть фильтры "Поддерживаемые цифровые стандарты" или любой другой, они работают также.

Я примерно понимаю, что вам требуется, скорее всего логика данного типа характеристики и фильтра вам не подходит. Существующий фильтр ищет все варианты, а не строгое попадание.

Иначе, по вашей логике, не один телевизор не будет найден, пока покупатель в точности не подберёт галочки.

Попробуйте подвести к варианту DVI+HDMI

Когда я выберу в вашем фильтре DVI , то я не увижу товаров, так как у большинства будет HDMI и DVI .

Почти такой же пример, обувь, размеры 38,39,40,41,42 . У товара отмечена 40, 41, 42 . Товар не будет показан покупателю, если покупатель кликнет 40 .

p.s. Пытался разобраться в вашей fn.catalog.php это жжесть в плане фильтра :)

Функциональность сложная, с одного захода осилить не получится. Фильтры, это не просто "+одно" условие в запросе из одной таблички.

Всё там отлично, логично и правильно. Фильтры к 4.3.х перерабатывались нашими лучшими специалистами.

Ну, например, откроем всем известный и ненуждающийся в рекламе

http://www.eldorado.ru/cat/1482093/

Там есть фильтры "Поддерживаемые цифровые стандарты" или любой другой, они работают также.

Я примерно понимаю, что вам требуется, скорее всего логика данного типа характеристики и фильтра вам не подходит. Существующий фильтр ищет все варианты, а не строгое попадание.

Иначе, по вашей логике, не один телевизор не будет найден, пока покупатель в точности не подберёт галочки.

Попробуйте подвести к варианту DVI+HDMI

Когда я выберу в вашем фильтре DVI , то я не увижу товаров, так как у большинства будет HDMI и DVI .

Почти такой же пример, обувь, размеры 38,39,40,41,42 . У товара отмечена 40, 41, 42 . Товар не будет показан покупателю, если покупатель кликнет 40 .

>Когда я выберу в вашем фильтре DVI , то я не увижу товаров, так как у большинства будет HDMI и DVI .

Увидите т.к. выберутся все у которых есть DVI, Нужно не точное соответствие а точное вхождение по выбранным параметрам, невозможные сочетания будут отсекатся на кажой итерации в которой добавляется новая галочка. У Вас сейчас ИЛИ, МНЕ нужно И. По обуви согласен там нужно по другому, в итоге в настройках нужно дклать еще один подвид [Флажек несколько И; Флажек несколько ИЛИ]. Я то выкручусь уже даже придумал как но это очередной костыль ... Правильные еще у крупных парйс агрегаторов, как и правило хорошего тона по поводу колличества товара который отобразится при выборе значения в скобочках :)

>Когда я выберу в вашем фильтре DVI , то я не увижу товаров, так как у большинства будет HDMI и DVI .

Увидите т.к. выберутся все у которых есть DVI, Нужно не точное соответствие а точное вхождение по выбранным параметрам, невозможные сочетания будут отсекатся на кажой итерации в которой добавляется новая галочка. У Вас сейчас ИЛИ, МНЕ нужно И. По обуви согласен там нужно по другому, в итоге в настройках нужно дклать еще один подвид [Флажек несколько И; Флажек несколько ИЛИ]. Я то выкручусь уже даже придумал как но это очередной костыль ... Правильные еще у крупных парйс агрегаторов, как и правило хорошего тона по поводу колличества товара который отобразится при выборе значения в скобочках :)

И кстати, вообще не логично. Для меня важен интерфейс HDMI , я щёлкаю и его в фильтре и ваш магазин мне не покажет вариантов. Почему? Потому что нужно было щёлкнуть HDMI и DVI .

Если нужно точное соответствие, то используйте другой тип характеристики, тем более вариантов в вашей характеристике не много.

Вариантов решения много, например, вы можете ввести свой тип характеристики и расширить фильтр. Там есть хуки и схемы для расширения.

Каждый проект имеет свои особенности. Приводить в пример агрегаторов давольно странно, так как это совершенно другой уровень:
1. Обрезанные и стандартизованные данные у агрегатора.
2. Каждый агрегатор имеет разработан с нуля + штат программистов + неограниченные серверные мощности.
3. Отложенная индексация и обновление данных.