左连接右表上的返回重复数据并且计数返回错误的结果

时间:2015-06-23 16:41:38

标签: sql count left-join

我有两张表:进口和订单:我分别附上了这些表 enter image description here enter image description here 我想要的是:  1.所有导入表组数据按产品ID分组。  2.产品ID的订单表的总和列数。  在我的表中,导入表中有3行,产品编号为1,订单表中有两行,产品编号为1,这两行的编号为:1,5。 所以我的预期结果是:导入表的所有行没有重复相同的product_id和总数是6.但是我得到的是18而不是6.但是对于产品ID 2我得到的碎片为1.这意味着6重复为3因导入表中的3行而产生的时间,其中product_id = 1。

但我怎样才能得到预期的结果呢?这是我的疑问:

SELECT `Import`.*, SUM(case when orders.status = "sold" THEN orders.pieces else 0 end) as total_sell FROM `amrajegeachi`.`imports` AS `Import` LEFT OUTER JOIN `orders` ON `Import`.`product_id` = `orders`.`product_id` WHERE 1 = 1 GROUP BY `Import`.`product_id`  

这就是结果:

Array
(
    [0] => Array
        (
            [Import] => Array
                (
                    [id] => 1
                    [category_id] => 1
                    [product_id] => 1
                    [amount] => 50
                    [cost] => 8320
                    [paid] => 0
                    [comment] => transportation and others cost: 100  
                    [created] => 2015-06-22 12:09:20
                )

            [0] => Array
                (
                    [total_sell] => 18
                )

        )

    [1] => Array
        (
            [Import] => Array
                (
                    [id] => 2
                    [category_id] => 2
                    [product_id] => 2
                    [amount] => 15
                    [cost] => 3000
                    [paid] => 0
                    [comment] => 
                    [created] => 2015-06-22 12:10:36
                )

            [0] => Array
                (
                    [total_sell] => 1
                )

        )

)

任何建议都是挪用的。提前致谢。

1 个答案:

答案 0 :(得分:1)

我太快读了你的问题而没有回答你的问题:

你说1. all data of import table group by product id. 2. sum of pieces column of orders table for a product id.

您正在使用'SUM'这是一个聚合函数。当您使用聚合函数时,任何其他列必须位于GROUP BY子句中才能聚合它们,因此如果您有:

Col1 | Col2 
1    | CategoryA
2    | CategoryA
2    | CategoryB

如果选择SUM(Col1), Col2无效,则因为SUM是聚合而Col2不是。您需要GROUP BY Col2

SELECT SUM(Col1), Col2 FROM table GROUP BY Col2

这会给你:

3 | CategoryA
2 | CategoryB

您的问题是您从导入表中选择*,这会导致您的分组错误。你需要这样做:

SELECT
  `Import`.product_id, 
  SUM(case when orders.status = "sold" THEN orders.pieces else 0 end) as total_sell

  FROM `amrajegeachi`.`imports` AS `Import` 
  LEFT OUTER JOIN `orders` ON `Import`.`product_id` = `orders`.`product_id` 
  WHERE 1 = 1 
  GROUP BY `Import`.product_id

这应该按产品ID对SUM进行分组,并为您提供正确的结果。