Не могу составить запрос MySQL для фильтра по товарам

GroZa

Есть таблица product (id, name). Есть таблица product_option (id, product_id, option_id) У продукта могут быть несколько опций, а может и не быть вообще.

Как одним запросом получить список продукции у которых есть опции (option_id), скажем: 1, 14, 25?

2 ответа

GroZa

SELECT p.id, p.name
  FROM product AS p
  JOIN product_option AS o
    ON p.id = o.product_id AND o.option_id in(1, 14, 25)
 GROUP BY p.id, p.name
HAVING count(1)=3

3 в условии HAVING это количество условий которые должны совпасть.

Будет работать при условии, что у продукта не может быть двух одинаковых опций. Ваша структура БД этого не гарантирует, т.к. уникальность наверняка только по полю id, таблицы product_option. Рекомендую вообще убрать поле id и primary key объявить составным, из двух оставшихся колонок primary key (option_id, product_id).


GroZa

Можно поступить следующим образом

SELECT
  p.id,
  p.name
FROM
  product AS p
JOIN
  product_option AS o1
ON
  p.id = o1.product_id AND
  o1.option_id = 1
JOIN
  product_option AS o2
ON
  p.id = o2.product_id AND
  o2.option_id = 14
JOIN
  product_option AS o3
ON
  p.id = o3.product_id AND
  o3.option_id = 25

licensed under cc by-sa 3.0 with attribution.