Неправильные строки возвращены фильтром интернет-магазина

У меня есть таблица с названием products с полями ID, NAME, URL, BRAND
Затем у меня есть поле с именем product_filter с идентификатором полей, PRODUCT_ID, TYPE, VALUE.

Предположим, у меня есть следующая таблица продуктов

1 | ПРОДУКТ 1 | продукт-1 | Марка 1
2 | ПРОДУКТ 2 | продукт-2 | Марка 2
3 | ПРОДУКТ 3 | продукт-3 | Марка 1

и таблица product_filter

1 | 1 | материал | шерсть
2 | 1 | материал | хлопок
3 | 2 | материал | хлопок
4 | 3 | материал | шерсть
5 | 1 | сезон | падать
5 | 2 | сезон | падать
5 | 1 | сезон | все

и т. д.

Теперь, когда клиент находится на веб-странице и пытается отфильтровать

материал: шерсть, хлопок
сезон: осень

Мой результат — продукт 1 (имеет материалы и правильный сезон) и продукт 2 (1 материал и правильный сезон).

Я попробовал это с помощью соединения

SELECT DISTINCT(shop_product.product_number), `shop_product`.`color_count`, `shop_product`.`category_id`, `shop_product`.`in_stock`, `shop_product`.`url_image`, `shop_product_description`.* FROM (`shop_product`) JOIN `shop_product_description` ON `shop_product`.`id` = `shop_product_description`.`product_id` JOIN `shop_category_description` ON `shop_product`.`category_id` = `shop_category_description`.`category_id` INNER JOIN `shop_filters` ON `shop_product`.`id` = `shop_filters`.`product_id` WHERE `shop_product`.`status` = 1 AND `shop_product_description`.`language_id` = '1' AND `shop_category_description`.`language_id` = '1' AND ( (shop_filters.type = '1' AND shop_filters.keyword = 'cotton') OR (shop_filters.type = '1' AND shop_filters.keyword = 'wool') ) AND (shop_filters.type = '2' AND shop_filters.keyword = 'fall') ORDER BY shop_product`.`url_image` asc, `shop_product_description`.`name` desc LIMIT 36

Я использовал Distinct, чтобы вернуть 1 продукт (потому что у продукта 1 были оба материала).

Но я не получаю результатов, пока я не изменюсь

( (shop_filters.type = '1' AND shop_filters.keyword = 'cotton') OR (shop_filters.type = '1' AND shop_filters.keyword = 'wool') ) AND (shop_filters.type = '2' AND shop_filters.keyword = 'fall')

в

( (shop_filters.type = '1' AND shop_filters.keyword = 'cotton') OR (shop_filters.type = '1' AND shop_filters.keyword = 'wool') ) OR (shop_filters.type = '2' AND shop_filters.keyword = 'fall')

Однако, мои результаты тогда — продукты с Хлопком или Шерстью ИЛИ падают.
Если у кого-то есть предложения, идея, пожалуйста …

0

Решение

Вы должны сопоставить несколько раз с таблицей фильтров, чтобы сравнить с каждым фильтром. Проще всего сделать несколько соединений.

SELECT DISTINCT(shop_product.product_number), shop_product.color_count, shop_product.category_id, shop_product.in_stock, shop_product.url_image, shop_product_description.*
FROM (shop_product)
JOIN shop_product_description ON shop_product.id = shop_product_description.product_id
JOIN shop_category_description ON shop_product.category_id = shop_category_description.category_id
INNER JOIN shop_filters sf1 ON shop_product.id = sf1.product_id
INNER JOIN shop_filters sf2 ON shop_product.id = sf2.product_id
WHERE shop_product.status = 1 AND shop_product_description.language_id = '1'
AND shop_category_description.language_id = '1'
AND ( (sf1.type = '1' AND shop_filters.sf1 = 'cotton') OR (sf1.type = '1' AND sf1.keyword = 'wool') )
AND (sf2.type = '2' AND sf2.keyword = 'fall')
ORDER BY shop_product.url_image asc, shop_product_description.name desc LIMIT 36
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]