2016-01-04 289 views
4

我有一个表命名product_cats,相关列MySQL的产品类别中选择

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=?) 
+0

您希望产品都在cat_id 1和2中?你能否展示你正在尝试的问题并使问题更清晰?有没有MySQL的魔术......但你可以使用索引 – fthiella

回答

1

使用MySQL,你可以实现你的逻辑通过使用group byhaving条款

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 

上面的查询sum函数将返回product_ids其中有cat_id 1和cat_id 2和cat_id可以是3,4,5

+1

这是完美的。把我的查询从89秒缩短到小于1.非常好奇,它究竟是怎么回事(魔术除外),你能解释一下吗? – user3663448

+0

@ user3663448它是一个聚合(group by&sum)和函数,其中sum(1 = 1)中的某个条件将返回结果作为布尔值0或1,并按产品ID进行分组,它将检查提供的条件,如(cat_id = 1 )对于其他条件是正确的或不相同的,之后我已经把这个逻辑过滤出了不符合这个标准的结果,使用having子句(通常用于过滤聚合函数的结果),希望它有一定的意义 –

1

要选择都在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_idcat_id指数应有助于提高性能:

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