MySQL, объединение нескольких строк - PullRequest
1 голос
/ 08 августа 2011

У меня проблема с объединением таблиц, которую мне не удалось решить. Почему-то у меня сложилось впечатление, что это проще, чем я думаю. В любом случае:

У меня есть три таблицы:

Заказы

OrderLines

оплата

В «заказах» каждая строка соответствует одному заказу, сделанному клиентом. Каждый ордер имеет идентификатор_порядка, который является первичным ключом для этой таблицы. В «строке заказа» я сохраняю содержание заказа, то есть ссылки на товары и услуги в заказе. Один заказ может, и обычно имеет много строк заказа. Наконец, в платежах я храню по одной строке для каждой транзакции, совершенной для оплаты заказа.

В идеале в одном заказе никогда не должно быть более одной соответствующей строки в платежах. Но поскольку клиенты являются клиентами, то нередко кто-то оплачивает один и тот же счет дважды, намекая на то, что в таблице платежей может быть два или более платежей за один заказ.

Поэтому было бы полезно создать запрос, который объединяет все три таблицы соответствующим образом, но мне не удалось это сделать. Например:

ВЫБРАТЬ orders.order_id, SUM (orderlines.amount), SUM (payment.amount) ОТ заказов LEFT JOIN ON orders.order_id = orderlines.order_id Платежи влево ON orders.order_id = payment.order_id GROUP BY orders.order_id

Цель этого объединения - узнать, равна ли сумма платежей в заказе сумме. Проблема здесь заключается в том, что две таблицы платежей и строки заказов «отвлекают» друг друга, вызывая появление нескольких строк при объединении.

Есть ли простое решение этой проблемы?

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Может быть, я слишком усложняю вещи, но использование обеих таблиц и получение суммы всегда приведет к неверным результатам, т. Е. Один заказ имеет 10 строк строки заказа и 1 строку платежа => сумма платежа будет добавлена ​​10 раз.Я полагаю, что вы должны использовать подобранные ниже подвыборки (вы не использовали ничего из «заказов» таблицы, кроме идентификатора, поэтому я пропустил это, потому что все заказы имеют строки заказов):

SELECT t1.order_id, t1.OrderAmount, t2.PaymentAmount
FROM (SELECT SUM(amount) AS OrderAmount, order_id
      FROM orderlines
      GROUP BY order_id) AS t1
LEFT JOIN (SELECT SUM(amount) AS PaymentAmount, order_id
        FROM payments
        GROUP BY order_id) AS t2 
        ON t1.order_id=t2.order_id
0 голосов
/ 08 августа 2011

Я думаю, вы хотите получить сумму всех предметов и сумму всех платежей, а затем связать их вместе.Суб-выбор может сделать это.

Что-то вроде: (ps у меня нет базы данных, поэтому она может быть недействительной sql)

SELECT * FROM orders
LEFT JOIN (SELECT order_id, SUM(amount) FROM orderlines GROUP BY order_id) AS ordersums
ON orders.order_id = ordersums.order_id
LEFT JOIN (SELECT order_id, SUM(amount) FROM payments GROUP BY order_id) AS paymentsums
ON orders.order_id = paymentsums.order_id;
...