Объединение полей с разных баз в одну - MySQL
Формулировка задачи:
Здравствуйте!
Возникла проблема при создании запроса.
Таблицы
1. orders
uid,client,order_id,close_date...
2. balance
uid,order_uid,client,summa,dohod....
Нужно сделать выборку из базы orders и подставить доход и расход из balance, которая получается как сумма всех списаний/начислений (доход - dohod='1',Расход - dohod='2'), соответствующий этому заказу balance.order_uid=orders.uid
Сделал поэтапно:
SELECT * FROM orders WHERE close_date BETWEEN '2016-02-01 00:00:00' AND '2016-02-29 23:59:00' and client='$client'
она выдает список заказов и отсюда беру uid и подставляю во второй запрос
есть запрос: SELECT sum(summa) FROM balance WHERE order_uid='$uid' and dohod='1' //получаю доход по этому заказу
есть запрос: SELECT sum(summa) FROM balance WHERE order_uid='$uid' and dohod='2' //получаю расход по этому заказу
Как результат, работает нормально, но жутко долго... Уверен, что можно объедить в один запрос, а не делать тысячи...
Пытался - не получается либо список заказов со списком операций, либо один заказ с общей суммой...
Как реализовать? Буду премного благодарен.
Выводит корректно, но на выборку из 77 заказов тратит аж 180 секунд. Это существенно больше, чем при последовательных действиях со множеством запросов... Подскажите, в чем дело?
Сделал следующий запрос:
SELECT uid AS O_UID,order_id,(SELECT SUM(summa) FROM balance WHERE order_uid=O_UID AND dohod='1') AS d,(SELECT SUM(summa) FROM balance WHERE order_uid=O_UID AND dohod='2') AS r FROM orders WHERE close_date BETWEEN '2016-02-01 00:00:00' AND '2016-02-29 23:59:00' AND client='client'
Решение задачи: «Объединение полей с разных баз в одну»
textual
Листинг программы
SELECT o.uid, order_id, SUM(b1.summa) d, SUM(b2.summa) r FROM orders o LEFT JOIN balance b1 ON b1.order_uid = o.uid AND b1.dohod=1 LEFT JOIN balance b2 ON b2.order_uid = o.uid AND b2.dohod=2 WHERE o.close_date BETWEEN '2016-02-01 00:00:00' AND '2016-02-29 23:59:00' AND o.client='client'
Объяснение кода листинга программы
- Код объединяет таблицы
orders
,balance
с помощью оператораLEFT JOIN
- В результате объединения создаются новые поля
b1.summa
иb2.summa
- В итоговой выборке участвуют только строки, где
o.close_date
находится в диапазоне от '2016-02-01 00:00:00' до '2016-02-29 23:59:00' - Также в итоговой выборке участвуют только строки, где
o.client
равен 'client' - В итоговой выборке вычисляются суммы
SUM(b1.summa)
иSUM(b2.summa)
- Выбранные поля для вывода:
o.uid
,order_id
,d
,r
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д