@leha78

Как сделать такой сложный запрос из нескольких параметров?

Уже неделю мучаюсь, не могу решить данную задачку. Прошу помощи.
Есть таблица с параметрами товаров
product_product_options (ppo)
id, product_id, option_id, option_title, option_value

Примерные значения в таблицах:
3, 5, 5, 'Цвет', 'Красный'
4, 5, 5, 'Цвет', 'Черный'
5, 5, 5, 'Размер', '35'

И таблица, где указана, какая опция относится к товару, и какая категория у товара,
В зависимости от айди категории, опции выводятся в определенных категориях.

Примерные значения в таблицах
id, ppo_id, product_id, category_id
1, 3, 5, 100

Эти опции отображены на сайте в виде чекбоксов.

Цвета:
Красный
Черный

Размеры
35
36

Нужно сделать выборку так, чтобы если пользователь выбирает красный цвет, то чтобы отображались товары только в красном цвете, а если выберет два чекбокса: красный и размер 35, то соответсвенно красная одежда с размером 35.

Какую выборку здесь можно сделать? У меня вариантов не осталось даже. Заранее благодарен.
  • Вопрос задан
  • 168 просмотров
Решения вопроса 1
DmitriyEntelis
@DmitriyEntelis Куратор тега MySQL
Думаю за деньги
Я полагаю что у вас в условиях опечатка и option_id все-таки уникально описывает возможный параметр.
Если это не так, мои запросы нужно будет переписать под уникальное условие (ну или навести порядок в структуре данных что больнее, но в целом правильнее)

Самый простой вариант решения:
select product.* from product where
product_id in ( select product_id from product_options where option_id = 5 and option_value = "Красный" )
and 
product_id in ( select product_id from product_options where option_id = 6 and option_value = "35" )

В ряде случаев может быть выгоднее с точки зрения быстродействия делать подзапросы на получение id отвечающих каждой категории отдельно, а объединять их на языке программирования.
Заодно это позволит делать нечеткий поиск, например когда совпадения не полные.

Если хочется поизвращаться можно поэкспериментировать с запросом вида
select product.product_id, count(product_options.id) cnt from product 
join product_options on product_options.product_id = product.product_id AND ((option_id = 5 and option_value = "Красный" ) or (option_id = 6 and option_value = "35" ))
group by product.product_id
having cnt = 2

На ряде запросов это может быть быстрее

PS Вообще есть мнение что решать это на Sql в реальном проекте не очень правильно с точки зрения нагрузки, лучше какой-нибудь elastic search прикрутить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы