左联接返回右 table 的重复数据并计数 returns 错误的结果

left join returnt duplicate data on right table and count returns wrong result

我有两个table:进口和订单:我分别附上了它们。
我想要的是: 1. import table 的所有数据按product id分组。 2. 产品编号的订单总和列 table。 在我的 tables 中,导入 table 中有 3 行产品 ID 为 1,订单 table 中有两行产品 ID 为 1,这两行的部分是:1,5。 所以我的预期结果是:导入的所有行 table 不重复相同 product_id 并且总件数为 6。但我得到 18 而不是 6。但是对于产品 ID 2,我得到的件数为 1 . 这意味着 6 被重复了 3 次,因为 imports table 中有 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. 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

如果您执行 select SUM(Col1), Col2 那是无效的,因为 SUM 是聚合而 Col2 不是。您需要 GROUP BY Col2:

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

这会给你:

3 | CategoryA
2 | CategoryB

您的问题是您 selecting * 来自导入 table,这导致您的分组错误。你需要做的:

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 进行分组并给出正确的结果。