类别选择中的mysql产品

类别选择中的mysql产品,mysql,categories,product,Mysql,Categories,Product,我有一个名为product_cats的表,相关列如下 product_id, cat_id 假设我们有第1、2、3、4和5类 我需要cat_id 1和2以及(3或4或5)中的所有产品_id 目前我有一些工作方法,但都非常缓慢 有人能给我施点魔法吗 编辑: 因此,产品需要同时属于类别1和类别2,以及类别3、类别4或类别5 这是我试图让这个想法变得更好的一次尝试 SELECT p1.product_id FROM product_cats p1 JOIN product_cats p2 O

我有一个名为product_cats的表,相关列如下

product_id,
cat_id
假设我们有第1、2、3、4和5类

我需要cat_id 1和2以及(3或4或5)中的所有产品_id

目前我有一些工作方法,但都非常缓慢

有人能给我施点魔法吗

编辑:

因此,产品需要同时属于类别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=?)

要选择类别1和类别2中的产品,可以使用如下查询:

select
  product_id
from
 product_cats
where
  cat_id in (1,2)
group by
  product_id
having
  count(distinct cat_id)=2;
关于
产品标识
猫标识
的索引应有助于提高性能:

alter table product_cats add index idx_product_cats (product_id, cat_id);

使用Mysql,您可以通过使用
groupby
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

上面的查询将返回具有cat_id 1和cat_id 2的产品id,cat_id可以是3,4,5

您想要同时位于cat_id 1和2中的产品吗?你能展示你正在尝试的问题并使问题更清楚吗?没有mysql的魔力。。。但你可以使用索引这是完美的。将我的查询时间从89秒缩短到不到1秒。非常好奇它到底是怎么回事(除了魔法),你能解释一下吗?@user3663448它是一个聚合(group by&sum)和函数,其中包含一些条件sum(1=1)将返回布尔值0或1的结果,并按产品id分组,它将检查提供的条件,如(cat_id=1)是真是假,对于其他条件也是一样,之后我使用having子句(通常用于过滤聚合函数的结果)将这个逻辑过滤掉与这个条件不匹配的结果,希望它有一些意义