MySQL 由连接引起的计数差异

标签 mysql

我在 MySQL 中遇到问题,我使用 COUNT 函数作为条件。但是,当将此与联接结合使用时,尽管我使用分组,但 COUNT 值包括所有行,甚至是过滤掉的行。 我提供了一个最小的工作示例,但是它可能没有实际意义或者设计得很巧妙。 假设我有 3 个表:

  • 包含以下字段的产品:productId、名称、事件( bool 值)
  • 包含以下字段的团队:teamId、名称
  • rel_product 包含以下字段:teamId、productId

所以基本上我有带有 ID 和名称的产品和团队。产品可以是活跃的(可以说这意味着它们仍在生产左右)。 然后我就知道哪个团队正在开发哪个产品。 为了解释我的问题,假设表中包含以下用于澄清问题的最小数据量:

  • 产品 Products
  • 团队 enter image description here
  • rel_生产 enter image description here

现在我想要做的查询是,用简单的英语来说:“我希望所有团队都在开发两种产品,同时至少一种产品必须处于事件状态。” 查询一般有效,在 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 子句的结果的屏幕截图: enter image description here 我明白为什么会发生这种情况,因为 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/

相关文章:

MYSQL 选择另一个表中出现的多个 id 的计数

MySQL 转储恢复不会恢复仅包含 1 行的表的数据

MySQL:DROP PARTITION 是否触发了 TRIGGER ON DELETE?

java - 从 Java 连接到托管在虚拟机中的 MYSQL 数据库

MySQL从table2中选择数据,其中table1.field相等(并将其添加到结果中)

php - 无法从下拉列表中选择结果

更新前的 MySQL 使用 PhpMyAdmin 触发插入语法错误

mysql - 替换所有行中的值

mysql - Django 查询与同一个表上的另一个查询连接

MySQL : Syntax error creating new trigger with Inner Join