MySQL与连接引起的计数不同

时间:2018-02-06 11:13:29

标签: mysql

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

  • 带有字段的产品:productId,name,active(boolean)
  • 拥有字段的团队:teamId,name
  • rel_production with fields:teamId,productId

所以基本上我有产品和团队的ID和名称。产品可以是活跃的(假设这意味着它们仍在生产中)。 然后我有一个关系,哪个团队正在研究哪个产品。 为了解释我的问题,假设表中包含以下最小数量的数据来澄清问题:

  • 产品 Products
  • enter image description here
  • rel_production enter image description here

现在我要做的查询是用简单的英语:"我希望所有正在处理2个产品的团队,而至少有一个产品必须是活跃的。" 查询一般有效,在mysql中如下:

<EditText
   android:textSize="20dp"
   android:onClick="makeTextViewFocusedBigger"/>
<EditText
   android:textSize="20dp"
   android:onClick="makeTextViewFocusedBigger"/>

现在问题在于团队1.因为它正在处理2个活动产品,COUNT(r_count.productId)将是4而不是2.所以我的查询将过滤掉它。 这是没有HAVING子句的结果的屏幕截图: enter image description here 我明白为什么会发生这种情况,因为rel_production上的两个内连接将导致生成4行。但随后他们将使用GROUP BY合并为一个。所以我需要的是GROUP之后的COUNT而不是之前的COUNT。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

在单独的子查询中对团队执行过滤,然后加入到:

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