我有3个数据库表。我存储销售数据,比如发票编号、到期日、开具日期。第二个表我存储了前一个表中的销售记录id,在那里我存储了个人支付的金额(比如客户只支付了总价的一半)。在第三个表中,我存储了产品,并且每一行都有用于反向引用的销售记录id,在这个表中,我有数量和小计(数量*价格)。
我需要的是从第一个表中选择所有的记录,并根据sell_id我必须总结他们从第二个表中支付了多少钱,总结了一个人购买了多少产品和它花费了多少钱。我需要一些正确的解决方案的指导,因为我被卡住了。到目前为止,我得到了这个令人难以置信的解决方案:
SELECT
(SELECT SUM(payment.sellpayment_amount) FROM es_sellpayment payment WHERE sell.sell_id = payment.sell_id) AS payed,
(SELECT SUM(product.sellproduct_quantity) FROM es_sellproduct product WHERE sell.sell_id = product.sell_id) AS quantity,
(SELECT SUM(product.sellproduct_total) FROM es_sellproduct product WHERE sell.sell_id = product.sell_id) AS total
FROM es_sell sell它起作用了,我得到了正确的结果,但我不确定/不知道这将如何影响网站的性能。我尝试了经典的左连接,它给了我错误的结果。我也在考虑将这3个值永久地存储在主表中;但这将是最不可取的方法,因为我必须进行至少2个单独的SQL查询来检索记录。
CREATE TABLE `es_sell` (
`sell_id` int(11) NOT NULL,
`sell_invoice` int(11) NOT NULL,
`sell_note` text COLLATE utf8mb4_unicode_ci NOT NULL,
`sell_deliver` datetime NOT NULL,
`sell_issued` datetime NOT NULL,
`sell_due` datetime NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `es_sellproduct` (
`sellproduct_id` int(11) NOT NULL,
`product_id` int(11) NOT NULL,
`sellproduct_quantity` int(11) NOT NULL,
`sellproduct_price` int(11) NOT NULL,
`pricetype_id` int(11) NOT NULL,
`sellproduct_total` decimal(11,3) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `es_sellpayment` (
`sellpayment_id` int(11) NOT NULL,
`sellpayment_amount` decimal(11,3) NOT NULL,
`sell_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;发布于 2017-12-18 07:39:09
使用子查询聚合关联表,以确保仅将一行连接到一行……
SELECT
sell.sell_id,
payment.payed,
product.quantity,
product.total
FROM
es_sell sell
LEFT JOIN
(
SELECT
sell_id,
SUM(sellpayment_amount) AS payed
FROM
es_sellpayment payment
GROUP BY
sell_id
)
payment
ON payment.sell_id = sell.sell_id
LEFT JOIN
(
SELECT
sell_id,
SUM(sellproduct_quantity) AS quantity,
SUM(sellproduct_total ) AS total
FROM
es_sellproduct
GROUP BY
sell_id
)
product
ON product.sell_id = sell.sell_id如果sell_id在sell表中不是惟一的,那么可以在外部查询中再次聚合。
https://stackoverflow.com/questions/47860139
复制相似问题