У меня 3 таблицы базы данных. Тот, который я храню, продает данные, такие как номер счета, дату платежа, дату выпуска. Во второй таблице у меня есть идентификатор записи продажи, хранящийся из предыдущей таблицы, там я храню сумму, которую заплатил человек (что-то вроде того, что клиент заплатил только половину общей цены). В третьей таблице я храню продукты, и каждая строка имеет идентификатор записи продажи для обратной ссылки, в этой таблице у меня есть количество и промежуточный итог (количество * цена).
Мне нужно выбрать всю запись из первой таблицы и на основе 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;
Используйте подзапросы для агрегирования связанных таблиц, чтобы убедиться, что вы только когда-либо соединяете одну строку с одной строкой...
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
, вы можете снова заполнить его во внешнем запросе.