Выбился из сил. Как реализовать следующее:
есть таблица "product_attribute" следующей структуры (с мини примером):
product_id attribute_id text
105 5 100
105 8 55
105 9 92
106 5 100
106 8 95
106 9 93
107 5 100
107 8 55
107 9 80
и таблица с категориями "product_category"
product_id category_id
105 8
106 8
107 8
Нам надо получить фильтр, где пользователь указывает категорию и несколько атрибутов (например: категория - 8, выбранные атрибуты attribute_id 5 с text 100 и attribute_id 8 с text 55. надо выбрать оставшиеся варианты атрибутов в данном случае должно вернуть attribute_id=9, text=92 и attribute_id=9, text=80
ещё поясню: это фильтр шин на сайте, где используются такие атрибуты как радиус, ширина, высота, сезонность. фильтр работает ajax. каждый раз при выборе одного из селекторов, он обновляет не выбранные подгружая только допустимые значения
какие есть мысли?
Понимаю, что правильный вопрос уже дан, чисто для себя хотел решить эту задачу, но не до конца понял условие. Ведь при таких вводных данных должны вернуться "9 92, 8 95, 9 93, 9 80", почему "8 95, 9 93" в выборку не попадают?
mletov: потому что в условии атрибут 5 должен быть равен 100 и 8 = 55, такому условию соответствуют товары только 105 и 107. вот их оставшиеся атрибуты мы и выводим, т.е. 9=80 и 9=92
Для правильного вопроса надо знать половину ответа
Как-то так:
SELECT DISTINCT `a`.`attribute_id`, `a`.`text`
FROM (
SELECT DISTINCT `p`.`id`
FROM `product` AS `p`
JOIN `product_category` AS `c` ON `c`.`product_id` = `p`.`id`
AND `c`.`category_id` = :categoryId
JOIN `product_attribute` AS `a1` ON `a1`.`product_id` = `p`.`id`
AND `a1`.`attribute_id` = :attribute1 AND `a1`.`text` = :attrValue1
JOIN `product_attribute` AS `a2` ON `a2`.`product_id` = `p`.`id`
AND `a2`.`attribute_id` = :attribute2 AND `a2`.`text` = :attrValue2
...
JOIN `product_attribute` AS `aN` ON `aN`.`product_id` = `p`.`id`
AND `aN`.`attribute_id` = :attributeN AND `aN`.`text` = :attrValueN
) AS `pr`
JOIN `product_attribute` AS `a` ON `a`.`product_id` = `p`.`id`
WHERE `a`.`attribute_id` NOT IN (:attribute1, :attribute2,... attributeN)
ORDER BY `a`.`attribute_id, `a`.`text`
alst161: Да в принципе необязательно, на автомате приписал. Можно и так (подзапрос):
SELECT DISTINCT `c`.`product_id`
FROM `product_category` AS `c`
JOIN `product_attribute` AS `a1` ON `a1`.`product_id` = `c`.`product_id`
AND `a1`.`attribute_id` = :attribute1 AND `a1`.`text` = :attrValue1
...
WHERE `c`.`category_id` = :categoryId
Rsa97: всё хорошо. спасибо за помощь, только один момент: ошибка тут ON `a`.`product_id` = `p`.`id` вместо `p`.`id` надо `pr`.`id`. а так спасибо большое)
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.