Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 第二个内部联接加倍计数结果_Mysql_Sql - Fatal编程技术网

Mysql 第二个内部联接加倍计数结果

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

我有表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 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
在这种情况下,您的第三个表ie
table_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你是对的-我已经删除了第二个解决方案