我在 MySQL 中遇到问题,我使用 COUNT 函数作为条件。但是,当将此与联接结合使用时,尽管我使用分组,但 COUNT 值包括所有行,甚至是过滤掉的行。 我提供了一个最小的工作示例,但是它可能没有实际意义或者设计得很巧妙。 假设我有 3 个表:
- 包含以下字段的产品:productId、名称、事件( bool 值)
- 包含以下字段的团队:teamId、名称
- rel_product 包含以下字段:teamId、productId
所以基本上我有带有 ID 和名称的产品和团队。产品可以是活跃的(可以说这意味着它们仍在生产左右)。 然后我就知道哪个团队正在开发哪个产品。 为了解释我的问题,假设表中包含以下用于澄清问题的最小数据量:
现在我想要做的查询是,用简单的英语来说:“我希望所有团队都在开发两种产品,同时至少一种产品必须处于事件状态。” 查询一般有效,在 mysql 中如下:
SELECT
teams.*,
"r_count:",
r_count.*,
COUNT(r_count.productId),
"r_active:",
r_active.*,
"p_active:",
p_active.*
FROM teams
INNER JOIN rel_production r_active ON r_active.teamId = teams.teamId
INNER JOIN products p_active ON p_active.productId = r_active.productId AND p_active.active
INNER JOIN rel_production r_count ON r_count.teamId = teams.teamId
GROUP BY teams.teamId, r_active.teamId
HAVING COUNT(r_count.productId) = 2 #4 is the problem!!!!!!!!!!!!!
现在问题出在团队 1 上。因为它正在处理 2 个活跃产品,所以 COUNT(r_count.productId) 将是 4 而不是 2。所以我的查询会将其过滤掉。 这是不带 HAVING 子句的结果的屏幕截图: 我明白为什么会发生这种情况,因为 rel_Production 上的两个内部联接将导致生成 4 行。但随后它们总是使用 GROUP BY 合并在一起。所以我需要的是 GROUP 之后而不是之前的 COUNT。 我该如何解决这个问题?
最佳答案
在单独的子查询中对团队执行过滤,然后加入该子查询:
SELECT
t1.teamId,
t1.name
FROM teams t1
INNER JOIN
(
SELECT t1.teamId
FROM rel_production t1
INNER JOIN products t2
ON t1.productId = t2.productId
GROUP BY t1.teamId
HAVING COUNT(DISTINCT t1.productId) = 2 AND SUM(t2.active) > 0
) t2
ON t1.teamId = t2.teamId;
SQLFiddle
关于MySQL 由连接引起的计数差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48641690/