我相信这个问题已经在这里出现了好几次了,但是我在Stack上的答案中没有找到一个简单的解决方案。
我的问题是,当我具有1:n关系并且在A表行上使用LEFT JOIN时,其中一个A行可以有多个B行,如何获取A中的值之和?
假设我有一个用于orders
的A表transactions
和一个B表orders
。一个订单可以有多个交易。这是一个示例查询:
CREATE TABLE `orders` (
`id` int(11) NOT NULL,
`price` decimal(10,2) DEFAULT '0.00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `transactions` (
`id` int(11) NOT NULL,
`order_id` int(11) DEFAULT NULL,
`amount` decimal(10,2) DEFAULT '0.00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `orders` (`id`, `price`)
VALUES
(1, 330.00),
(2, 800.00);
INSERT INTO `transactions` (`id`, `order_id`, `amount`)
VALUES
(1, 1, 330.00),
(2, 2, 200.00),
(3, 2, 200.00),
(4, 2, 200.00);
然后,当我尝试总结订单价格时:
SELECT o.id, sum(o.price) from orders o
LEFT JOIN transactions tr ON o.id = tr.order_id
sum(o.price)
的结果为2730
。它应该是1130
(330 + 800)。相反,由于transactions
包含三个order(2)
,因此在结果中由LEFT JOIN对该订单进行了3个transaction
行,因此计算为330+800*3
。我尝试使用GROUP BY o.id
,但总和可能是在GROUP BY
(http://sqlfiddle.com/#!9/82bd8/8/0)之前计算的如何使总和显示正确的值,但保留LEFT JOIN?
最佳答案
您得到2730,因为您的联接与您的主数据集不是线性的。尽管我建议的答案不是执行此操作的最有效方法,但我相信它可以解决您的情况。
SELECT
orders.id,
(SELECT SUM(price) FROM orders) AS 'price'
FROM
orders
LEFT JOIN
transactions ON
transactions.order_id = orders.id
关于mysql - 左连接A行上的多个B行时如何求和A行列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33745753/