mysql - MySQL:某些类别的独特产品计数
问题描述
我有 3 张桌子:
products
categories
category_product
(对于“多对多”关系)。
“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。如何做到这一点?
解决方案
您可以使用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
推荐阅读
- visual-studio - GlobalSection ExtensibilityGlobals 在 .sln 文件中重复
- php - 加入两个数组
- java - 从 PDF 缩放 PDDocument
- .net-core - 在 Azure Pipelines 构建中命名生成的 ZIP 存档?
- python - 导入的变量更新未反映在父模块中
- oracle - oracle SQL开发人员无法通过另一个表创建表
- jinja2 - Apache气流 - 无法模板化从baseOperator继承的队列名称
- linux - 带有 & 符号的远程 wget 命令未按预期运行
- postgresql - 如何限制 typeorm 连接查询?
- c# - c# - 最快的方法从部分位获取整数