Объединение полей с разных баз в одну - 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' //получаю расход по этому заказу Как результат, работает нормально, но жутко долго... Уверен, что можно объедить в один запрос, а не делать тысячи... Пытался - не получается либо список заказов со списком операций, либо один заказ с общей суммой... Как реализовать? Буду премного благодарен.
Сделал следующий запрос:
Листинг программы
  1. 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'
Выводит корректно, но на выборку из 77 заказов тратит аж 180 секунд. Это существенно больше, чем при последовательных действиях со множеством запросов... Подскажите, в чем дело?

Решение задачи: «Объединение полей с разных баз в одну»

textual
Листинг программы
  1. SELECT
  2.     o.uid,
  3.     order_id,
  4.     SUM(b1.summa) d,
  5.     SUM(b2.summa) r
  6. FROM orders o
  7. LEFT JOIN balance b1
  8.     ON b1.order_uid = o.uid AND b1.dohod=1
  9. LEFT JOIN balance b2
  10.     ON b2.order_uid = o.uid AND b2.dohod=2
  11. WHERE o.close_date BETWEEN '2016-02-01 00:00:00' AND '2016-02-29 23:59:00'
  12.       AND o.client='client'

Объяснение кода листинга программы

  1. Код объединяет таблицы orders, balance с помощью оператора LEFT JOIN
  2. В результате объединения создаются новые поля b1.summa и b2.summa
  3. В итоговой выборке участвуют только строки, где o.close_date находится в диапазоне от '2016-02-01 00:00:00' до '2016-02-29 23:59:00'
  4. Также в итоговой выборке участвуют только строки, где o.client равен 'client'
  5. В итоговой выборке вычисляются суммы SUM(b1.summa) и SUM(b2.summa)
  6. Выбранные поля для вывода: o.uid, order_id, d, r

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы