gpt4 book ai didi

MySQL 由连接引起的计数差异

转载 作者:行者123 更新时间:2023-11-29 06:47:54 26 4
gpt4 key购买 nike

我在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com