使用AND(或)基于多个行值进行选择

时间:2019-05-20 11:47:10

标签: mysql sql

我想创建在多对多关系表上使用ANDOR的过滤器查询。

表仅包含两列id_productid_category

我正在使用的查询,但是不起作用:

SELECT id_product FROM id_category WHERE ( id_category = 1)  AND (id_category = 2) 
AND ( id_category = 3 OR id_category = 4 OR id_category = 5) GROUP BY id_product

我想同时检索属于类别的产品。 仅属于1 AND 2 AND(3或4或5)类别的产品的ID。

2 个答案:

答案 0 :(得分:3)

您必须按id_product分组,并将以下条件放在HAVING子句中:

SELECT id_product 
FROM tablename
GROUP BY id_product 
HAVING 
  SUM(id_category = 1) > 0
  AND
  SUM(id_category = 2) > 0
  AND
  SUM(id_category IN (3, 4, 5)) > 0

答案 1 :(得分:2)

只是为了好玩,在HAVING子句中使用一个条件:

SELECT id_product
FROM yourTable
WHERE id_category BETWEEN 1 AND 5
GROUP BY id_product
HAVING
    COUNT(DISTINCT CASE WHEN id_category IN (3, 4, 5)
                        THEN 3 ELSE id_category END) = 3;

Demo

这里的逻辑是首先将查询限制为仅id_category个值(1,2,3,4,5)。然后,我们断言但首先将id_category的{​​{1}}值映射到相同的单个值(3,4,5)。断言是映射的3值的 distinct 计数为id_category,这意味着31和{{1} }都发生在该产品上。