Необходимо оптимизировать запрос

virakochi

Устал
Необходимо оптимизировать запрос

Запрос идет по трем таблицам.

TABLE merchant:
merchant_id | merchant_billing_period

TABLE merchant_payment:
merchant_id | order_id | merchant_payment_amount

TABLE ordered_card_to_order:
order_id | price

merchant 1:n merchant_payment по merchant_id
merchant_payment 1:n ordered_card_to_order по order_id

Необходимо выбрать:
merchant_id, merchant_billing_period, сумму merchant_payment_amount, сумму price,
все сгруппированое по merchant_id
Mysql 4.1+

У меня пока получилось:
Код:
SELECT a.merchant_id, SUM(b.merchant_payment_amount) AS 'payment_amount', a.merchant_billing_period, price
	FROM merchant a
	INNER JOIN merchant_payment b ON a.merchant_id = b.merchant_id
	LEFT JOIN (
		SELECT a.merchant_id, SUM(c.price) AS 'price'
		FROM merchant a
		INNER JOIN merchant_payment b ON a.merchant_id = b.merchant_id
		LEFT JOIN ordered_card_to_order c ON b.order_id = c.order_id
		GROUP BY a.merchant_id
	) AS c ON c.merchant_id = a.merchant_id
	GROUP BY a.merchant_id
Подскажите, как это можно упростить, желательно без подзапросов.
Заранее спасибо.
 

chira

Новичок
ну а так не пробовал
Код:
SELECT a.merchant_id
, a.merchant_billing_period
, SUM(b.merchant_payment_amount)*COUNT(DISTINCT b.order_id)/COUNT(b.order_id) AS payment_amount
, SUM(c.price) AS price
FROM merchant a
INNER JOIN merchant_payment b ON a.merchant_id = b.merchant_id
LEFT JOIN ordered_card_to_order c ON b.order_id = c.order_id
GROUP BY a.merchant_id
если не то, объясняй простым языком
 

virakochi

Устал
Нет. Не то. Попробую объяснить.
В ordered_card_to_order лежит id и цена заказа. На один заказ может бать несколько записей (ключ - order_id, card_id(фактически сам товар), т.е. в заказ входит несколько товаров).

В merchant_payment ключ - order_id, merchant_id, т.е. по каждому заказу там лежит сумма оплаты мерчанту.

Ну и собственно в merchant лежит инфа о нем самом.

Выбрать мне нужно сумму всех payment-ов для мерчанта, а также сумму по всем заказам для мерчанта. Суммы merchant_payment_amount и sum(ordered_card_to_order.price) разные, т.е. не связаны.

Вроде понятнее объяснил.
 

chira

Новичок
ты запрос запускал?
он не правильно работает?
что именно не правильно?

-~{}~ 04.04.05 16:23:

можешь дать пример данных и результат который хочешь получить?
 

virakochi

Устал
chira
Конечно же запускал.

merchant_id || payment_amount || order_id | price
8 10 1 25
8 10 1 35
8 12 2 20

В результате будет:

payment_amount - 32* 2/3
price - 80

правильный результат (т.е. необходимый мне) -
payment_amount - 22
price - 80

Т.е. твой запрос выбирает усредненной значение, умноженное на кол-во реальных заказов.. Это не то что нужно.

-~{}~ 04.04.05 16:35:

То есть нужно как-то вставить внутреннюю групировку по заказу..
 

chira

Новичок
Код:
SELECT a.merchant_id
, a.merchant_billing_period
, SUM(b.merchant_payment_amount) AS payment_amount
, SUM(b.price) AS price
FROM merchant a
INNER JOIN (SELECT b.merchant_id
  , b.merchant_payment_amount
  , SUM(c.price) AS price
  FROM merchant_payment b
  LEFT JOIN ordered_card_to_order c ON b.order_id = c.order_id
  GROUP BY b.order_id) AS b ON b.merchant_id = a.merchant_id
GROUP BY a.merchant_id
 
Сверху