左联接返回右 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 进行分组并给出正确的结果。
我有两个table:进口和订单:我分别附上了它们。
但是我怎样才能得到我预期的结果呢?这是我的查询:
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 进行分组并给出正确的结果。