我相信这个问题已经在这里出现了好几次了,但是我在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 BYhttp://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/

10-08 23:20