首页 > 解决方案 > MySQL:某些类别的独特产品计数

问题描述

我有 3 张桌子:

“category_product”表示例:

+-------------+------------+
| category_id | product_id |
+-------------+------------+
|           3 |          9 |
|           3 |         28 |
|           3 |        100 |
|         ... |        ... |
|           7 |         13 |
|           7 |         21 |
|           7 |         81 |
|           7 |        100 |
|         ... |        ... |
|          25 |         22 |
|          25 |         28 |
|          25 |        100 |
+-------------+------------+

我需要查找此类别中独特产品的数量。在我的情况下,我必须从COUNT行中排除 whereproduct_id = 28和 100。如何做到这一点?

标签: mysqlsql

解决方案


您可以使用NOT EXISTS排除属于 1 个以上类别的产品:

SELECT cp.category_id, COUNT(*) counter
FROM category_product cp
WHERE NOT EXISTS (SELECT 1 FROM category_product WHERE product_id = cp.product_id AND category_id <> cp.category_id)
GROUP BY cp.category_id

或者使用返回product_id仅属于 1 个类别的 s 的查询:

SELECT product_id
FROM category_product
GROUP BY product_id
HAVING COUNT(*) = 1

作为带有运算符的子查询IN

SELECT category_id, COUNT(*) counter
FROM category_product
WHERE product_id IN (
  SELECT product_id
  FROM category_product
  GROUP BY product_id
  HAVING COUNT(*) = 1
)
GROUP BY category_id

请参阅演示
结果:

category_id | counter
----------: | ------:
          3 |       1
          7 |       3
         25 |       1

推荐阅读