Mysql 第二个内部联接加倍计数结果
我有表A、B和C。A有许多B和C。对于A,我有6条B记录,其中一半被标记为已删除(deleted_at!=null) 当我用查询选择时Mysql 第二个内部联接加倍计数结果,mysql,sql,Mysql,Sql,我有表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,计数:3) 但当我再添加一个内部连接时 SELECT a.id, COUNT(b.id) FROM t
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,计数: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,计数:6)
如何修复它?您可以计算不同的值
SELECT a.id, COUNT(DISTINCT 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;
当我开始编程时,我也面临同样的问题。 我不知道你是否也面临同样的问题 如果表c有多个与其他两个表(即表a和表b)匹配的coulmns 然后需要在
ON子句中添加另一个条件
示例:
假设
表a包括:
ID | Name | Secondary_id
ID | Some other coulmn |
ID | Some coulmn | Secondary_id
表b包括:
ID | Name | Secondary_id
ID | Some other coulmn |
ID | Some coulmn | Secondary_id
表a包括:
ID | Name | Secondary_id
ID | Some other coulmn |
ID | Some coulmn | Secondary_id
在这种情况下,您的第三个表ietable_c
将有两个与table_a
然后
您现在必须这样编写查询
select * from
table_a
JOIN tablE_b ON table_a.ID = table_b.ID
JOIN tablE_c ON tablE_c.ID = table_b.ID and table_a.Secondary_id = table_b.Secondary_id
注意,我在ON子句中添加了两个条件
ON tablE_c.ID = table_b.ID and table_a.Secondary_id = table_b.Secondary_id
我希望这将帮助您正如其他人提到的,您可以在这里计算不同的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中有值100200200,那么你会得到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;
COUNT(DISTINCT b.id)?如果提供样本表数据,最好分析查询。@Sergei Gorjunov我不完全确定您是否会遇到相同的问题,但您也可能面临相同的问题。第二种解决方案是错误的。对于一个a
你仍然可以有许多c
,因此将计数相乘。Thorsten你是对的-我已经删除了第二个解决方案