У меня есть таблица с именем product_cats, соответствующие столбцы

product_id,
cat_id

Скажем, у нас есть категории 1, 2, 3, 4 и 5.

Мне нужны все product_id в cat_id 1 и 2 и (3, 4 или 5).

На данный момент у меня есть несколько методов работы, но все они ужасно медленные.

Может ли кто-нибудь пролить на меня магию mysql?

Редактировать:

Таким образом, продукт должен быть как в категории 1, так и в категории 2, а также в категории 3, 4 или 5.

Вот одна из моих попыток улучшить идею

SELECT
  p1.product_id
FROM
  product_cats p1 JOIN product_cats p2 ON ( p2.product_id = p1.product_id )  
  JOIN product_cats p3 ON ( p3.product_id = p1.product_id )  
  JOIN product_cats p4 ON ( p4.product_id = p1.product_id )   
WHERE
  (p1.category_id=? AND p2.category_id=? AND p3.category_id=?)
  OR 
  (p1.category_id=? AND p2.category_id=? AND p4.category_id=?)
4
user3663448 4 Янв 2016 в 22:10

2 ответа

Лучший ответ

Используя Mysql, вы можете реализовать свою логику, используя функции group by и sum с предложением having

select product_id
from product_cats
group by product_id
having sum(cat_id = 1) > 0
and sum(cat_id = 2) > 0
and sum(cat_id in(3,4,5)) > 0

Вышеупомянутый запрос вернет product_ids, который имеет cat_id 1 и cat_id 2, а cat_id может быть 3,4,5.

1
M Khalid Junaid 4 Янв 2016 в 19:32

Чтобы выбрать продукты, которые находятся в категории 1 и 2, вы можете использовать следующий запрос:

select
  product_id
from
 product_cats
where
  cat_id in (1,2)
group by
  product_id
having
  count(distinct cat_id)=2;

Индекс для product_id и cat_id должен помочь улучшить производительность:

alter table product_cats add index idx_product_cats (product_id, cat_id);
2
fthiella 4 Янв 2016 в 19:29