24 декабря 2023 г. Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна.
Подробности случившегося. Мы призываем всех неравнодушных
помочь нам с восстановлением утраченного контента!
Пишу свой простенький фильтр для интернет магазина. Помогите пожалуйста с запросом.
Для начала опишу упрощенно структуру БД. Не обращайте внимания на некоторую избыточность, это сделано для упрощения запросов. Таблицы разбил по группам, чтобы выделить жирным отдельные поля, которые значат одно и то же.
products - id, name - таблица с товарами
subproducts - id, productid, price - таблица подтоваров. Просто у меня в один товар входит несколько подтоваров, каждый может иметь свою цену и определяется по количеству фильтров
filters - id, name - таблица с группой фильтров. Этой таблицей мы характеризуем группу фильтров, например, "цвет"
filter_parameters - id, filterid, value - это конкретно сами фильтры, разбитые по группам и имеющие значения
subproduct_filter_values - id, productid, subproductid, valueid - это таблица, которая в себе связывает айди подтовара с айди фильтра.
Сперва я сделал вот такой запрос (выделил жирным часть запроса с фильтрами):
SELECT FROM `products` LEFT JOIN `subproduct_filter_values` as `t2` ON `products`.`id`=`t2`.`productid` WHERE `hidden`=0 and (`catid`=11 or `catid`=12 or `catid`=13) and `price`>50 and `price`<5000 and ( `t2`.`valueid`=20 or `t2`.`valueid`=21) and ( `t2`.`valueid`=33 or `t2`.`valueid`=34) GROUP BY products.`id` ORDER BY `ord` DESC
И мне показалось, что работает. Но потом я отправил запрос, добавив ещё фильтр:
SELECT FROM `products` LEFT JOIN `subproduct_filter_values` as `t2` ON `products`.`id`=`t2`.`productid` WHERE `hidden`=0 and (`catid`=11 or `catid`=12 or `catid`=13) and `price`>50 and `price`<5000 and ( `t2`.`valueid`=12 or `t2`.`valueid`=13 or `t2`.`valueid`=19 or `t2`.`valueid`=20 or `t2`.`valueid`=21) and ( `t2`.`valueid`=33 or `t2`.`valueid`=34) GROUP BY products.`id` ORDER BY `ord` DESC
Видите, там фильтры перебираются через условия or? Если фильтры относятся к одной группе, то логично конечно or, но между группами фильтров мне надо and!
Тогда я снова переписал запрос:
SELECT * FROM `products` LEFT JOIN `subproduct_filter_values` as `t2` ON `products`.`id`=`t2`.`productid` WHERE `hidden`=0 and (`catid`=11 or `catid`=12 or `catid`=13) and `price`>50 and `price`<5000 and ( `t2`.`valueid`=16 or `t2`.`valueid`=17) and ( `t2`.`valueid`=33 or `t2`.`valueid`=34) GROUP BY products.`id` ORDER BY `ord` DESC
Я уже предвкушал как всё заработает, но нихуя не заработало. Ведь я обращаюсь к единственному параметру, а он не может быть одновременно иметь два и более значений. Помогите запрос составить пожалуйста. Блин, не знаю как объяснить точнее, я тупой хлебушек. Спрашивайте, постараюсь ответить на вопросы