gpt4 book ai didi

mysql - 第二个内部连接 double 计数结果

转载 作者:行者123 更新时间:2023-11-29 00:07:24 26 4
gpt4 key购买 nike

我有表 A、B 和 C。A 有很多 B 和 C。对于 A,我有 6 个 B 记录,其中一半被标记为已删除(deleted_at != null)。

当我选择查询时

SELECT a.id, COUNT(b.id)
FROM table_a a
INNER JOIN table_b b ON a.id = b.a_id AND b.deleted_at IS NULL
WHERE a.id = 5;

答案正确(id:5,count:3)

但是当我再添加一个内连接时

SELECT a.id, COUNT(b.id)
FROM table_a a
INNER JOIN table_b b ON a.id = b.a_id AND b.deleted_at IS NULL
INNER JOIN table_c c ON a.id = c.a_id AND c.deleted_at IS NULL
WHERE a.id = 5;

它加倍计数结果 (id:5, count: 6)

我该如何解决?

最佳答案

正如其他人提到的,您可以在此处计算不同的 b ID。

但是,当需要从各种表进行聚合时,您的问题很常见。出现问题是因为人们加入所有记录,然后尝试获取聚合。

例如:

SELECT a.id, SUM(b.value)
FROM table_a a
INNER JOIN table_b b ON a.id = b.a_id AND b.deleted_at IS NULL
INNER JOIN table_c c ON a.id = c.a_id AND c.deleted_at IS NULL
WHERE a.id = 5;

这几乎与您的查询相同。但是在这里您不能再使用 DISTINCT,因为如果 b 中的值为 100、200、200,那么您将得到 300 而不是 500。所以一般解决方案是:只加入实际应该加入的东西。以下是上述查询的两种解决方案:

解决方案 1:加入前聚合:

SELECT a.id, b.total
FROM table_a a
INNER JOIN
(
select a_id, sum(value) as total
from table_b
where deleted_at IS NULL
group by a_id
) b ON a.id = b.a_id
INNER JOIN table_c c ON a.id = c.a_id AND c.deleted_at IS NULL
WHERE a.id = 5;

解决方案 2:如果您只需要表中的一个值,请在 SELECT 子句中获取它:

SELECT a.id, 
(
select sum(value)
from table_b
where deleted_at IS NULL
and a_id = a.id
) as total
FROM table_a a
INNER JOIN table_c c ON a.id = c.a_id AND c.deleted_at IS NULL
WHERE a.id = 5;

关于mysql - 第二个内部连接 double 计数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26906658/

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