根据结果​​消除空类别?

时间:2012-01-11 12:13:53

标签: mysql

如何返回与查询结果相关的所有类别ID?

items_cats: (many to many)
product_id | category_id
====================
1          |  1
1          |  2
1          |  4
1          |  7

2          |  1
2          |  3
2          |  4
2          |  7

3          |  1
3          |  3
3          |  4
3          |  8

在下面的查询中,我获得了包含category_id 3和category_id 7的所有产品ID 但我也想知道哪个category_id(选项)仍然有选择的producs_id:

例如,我喜欢这个查询返回(基于代码示例):
-product_id = 2
-category_id:7,3,4,1

使用此功能时,我可能会想查看每页最多项目的查询。

代码I;到目前为止:

SELECT 
      DISTINCT t1.product_id, t1.category_id
    FROM 
      items_cats t1   
    INNER JOIN
       items_cats t1b 
       ON t1.product_id =t1b.product_id 
    WHERE
      t1.category_id=3 AND
      t1b.category_id=7

cat id的松散查询问题:

    SELECT 
       e1.category_id
    FROM 
      drinks_ingredients e1     
    WHERE
      e1.category_id=2

当然它返回2但我喜欢它返回1,2,4,7。

另一种方式是工作,但我如何通过大量产品和类别提高效率?我是否可以将这些查询结合起来。

    SELECT DISTINCT
       t1.category_id
    FROM  items_cats t1
    WHERE t1.product_id = 2

1 个答案:

答案 0 :(得分:1)

我确信还有其他方法可以做到这一点,但这里有一个。

首先,我们需要弄清楚我们感兴趣的product_id。您可以计算每个product_id所需的类别数量:

SELECT product_id, count(category_id) as numcats
FROM items_cats 
WHERE category_id IN (3,7) 
GROUP BY product_id;
+------------+---------+
| product_id | numcats |
+------------+---------+
|          1 |       1 |
|          2 |       2 |
|          3 |       1 |
+------------+---------+

由于我们指定了两个category_id(3和7),因此我们只对product_id count(category_id) = 2感兴趣。因此,在末尾添加HAVING numcats=2

SELECT product_id, COUNT(category_id) as numcats
FROM items_cats 
WHERE category_id IN (3,7) 
GROUP BY product_id
HAVING numcats=2;
# (returns all product_id with both category_id=3 and 7.

所以这里是我们想要product_id的所有category_id。 然后我们只选择上一个表中category_id所有的product_id

SELECT DISTINCT category_id
FROM items_cats
WHERE product_id IN
  (SELECT product_id
  FROM items_cats 
  WHERE category_id IN (3,7) 
  GROUP BY product_id
  HAVING COUNT(category_id)=2);

+-------------+
| category_id |
+-------------+
|           1 |
|           3 |
|           4 |
|           7 |
+-------------+