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

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

  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
Похожие ответы