Summarize 3 столбца из 2 разных таблиц в SQL

0

У меня 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;
Теги:
sum

1 ответ

0
Лучший ответ

Используйте подзапросы для агрегирования связанных таблиц, чтобы убедиться, что вы только когда-либо соединяете одну строку с одной строкой...

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, вы можете снова заполнить его во внешнем запросе.

  • 0
    Я признаю, что мне нужно больше времени учиться, а не просто прыгать в лодке и, в конечном счете, врезаться в гигантский камень. Ты + MatBailie, ты герой для меня, ты спас меня! Спасибо! Это работает безупречно, удивительно! Я обещаю здесь, что я собираюсь читать и практиковать больше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню