MySql查询结果不准确

时间:2014-04-12 11:59:04

标签: mysql sql

我有2个表(import_size,export_size)都包含这2列(size_id,weight) 现在,我正在尝试获取每个表中每个大小的权重总和,我的查询看起来像这样

SELECT sum(i.weight) imports,sum(e.weight) exports,s.size 
       FROM size s 
       LEFT JOIN import_size i on s.id=i.size_id 
       LEFT JOIN export_size e on s.id=e.size_id
       GROUP BY s.size

现在说例如在import_size表中,对于大小1,我们只有一条记录,但是对于相同大小的export_size表,我们有2条记录,import_size产生的权重之和乘以2,任何想法?

例如:

导入表有1条记录:

size_id 1 - weight 2 

导出表有2条记录:

size_id 1 - weight 2  
size_id 1 - weight 3 

查询结果:

imports 4 - exports 5 - size 1 

然而它应该是

imports 2 - exports 5 - size 1

1 个答案:

答案 0 :(得分:1)

一般来说,连接为每个与条件匹配的排列创建一行。您正在加入3个表。你说的是,对于大小1,这些表有:

  • size:1行
  • import_size:1行
  • export_size:2行

这给了我们1 * 1 * 2 = 2个排列,这意味着我们得到2行。显然,每条记录都包含不同的export_size记录,但sizeimport_size呢?这两行使用相同的记录。这意味着import_size.weight出现两次 - 这就是为什么它总结了两次。

BTW - 如果两个表都有2个大小为1的条目,那么您将获得4个排列,并且导入和导出大小都将加倍。

解决方案:为每个表单独进行聚合,然后进行连接(未测试):

SELECT i.imports, e.exports, s.size
    FROM size AS s
    LEFT JOIN (SELECT size_id,sum(weight) AS imports FROM import_size GROUP BY size_id) AS i ON s.id=i.size_id
    LEFT JOIN (SELECT size_id,sum(weight) AS exports FROM export_size GROUP BY size_id) AS e ON s.id=e.size_id