Объедините 2 отдельных запроса к базе данных в одном цикле foreach или объедините запросы в один - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть этот запрос для проверки показателей продаж за последние 3 месяца и еще один запрос для проверки показателей возврата. Я хотел бы отобразить их в виде таблицы:

сент. $ 100 $ 20
Авг $ 200 $ 10
Июль $ 150 $ 0

Но я не уверен, что было бы лучше попытаться объединить 2 запроса в один. Я попытался поместить цикл foreach для возмещения в цикле foreach продаж, но это привело к 6 строкам вместо 3.

       // sales
        SELECT DATE_FORMAT(order_date, '%b') as month, SUM(order_total) as totalSales FROM
        (
           SELECT order_date, order_total
           FROM order_summary
           WHERE order_date <= NOW()
           and order_date >= Date_add(Now(),interval - 3 month)
           AND `order_status` = 'Approved'

           UNION ALL
           SELECT  Date_add(Now(),interval - 2 month)  AS order_date, 0 as order_total
           UNION ALL
           SELECT  Date_add(Now(),interval - 1 month)   AS order_date, 0 as order_total
           UNION ALL
           SELECT  Now() AS order_date, 0 as order_total
        ) as test
        GROUP BY DATE_FORMAT(order_date, '%m-%Y')
        ORDER BY DATE_FORMAT(order_date, '%m-%Y') DESC

      // refunds
    SELECT DATE_FORMAT(credit_date, '%b') as month, SUM(`credit_value`) as totalCredit FROM
        (
           SELECT credit_value, credit_date
           FROM credit
           WHERE credit_date <= NOW()
           and credit_date >= Date_add(Now(),interval - 3 month)
           AND `reason` = 'Refund'

           UNION ALL
           SELECT  Date_add(Now(),interval - 2 month)  AS credit_date, 0 as credit_value
           UNION ALL
           SELECT  Date_add(Now(),interval - 1 month)   AS credit_date, 0 as credit_value
           UNION ALL
           SELECT  Now() AS credit_date, 0 as credit_value
        ) as test
        GROUP BY DATE_FORMAT(credit_date, '%m-%Y')
        ORDER BY DATE_FORMAT(credit_date, '%m-%Y') DESC
        ");

ОБНОВЛЕНИЕ ПОСЛЕ О. Джонс ОТВЕТ

 SELECT a.month, a.totalSales, b.totalCredit
 FROM (SELECT DATE_FORMAT(order_date, '%b') as month, SUM(order_total) as totalSales, DATE(DATE_FORMAT(order_date, '%Y-%m-01')) month_starting FROM
        (
           SELECT order_date, order_total
           FROM order_summary
           WHERE order_date <= NOW()
           and order_date >= Date_add(Now(),interval - 3 month)
           AND `order_status` = 'Approved'

           UNION ALL
           SELECT  Date_add(Now(),interval - 2 month)  AS order_date, 0 as order_total
           UNION ALL
           SELECT  Date_add(Now(),interval - 1 month)   AS order_date, 0 as order_total
           UNION ALL
           SELECT  Now() AS order_date, 0 as order_total
        ) as test
        GROUP BY DATE_FORMAT(order_date, '%m-%Y')
        ORDER BY DATE_FORMAT(order_date, '%m-%Y') DESC) a
 JOIN (         SELECT DATE_FORMAT(credit_date, '%b') as month, SUM(`credit_value`) as totalCredit, DATE(DATE_FORMAT(credit_date, '%Y-%m-01')) month_starting FROM
            (
               SELECT credit_value, credit_date
               FROM credit
               WHERE credit_date <= NOW()
               and credit_date >= Date_add(Now(),interval - 3 month)
               AND `reason` = 'Refund'

               UNION ALL
               SELECT  Date_add(Now(),interval - 2 month)  AS credit_date, 0 as credit_value
               UNION ALL
               SELECT  Date_add(Now(),interval - 1 month)   AS credit_date, 0 as credit_value
               UNION ALL
               SELECT  Now() AS credit_date, 0 as credit_value
            ) as test
            GROUP BY DATE_FORMAT(credit_date, '%m-%Y')
            ORDER BY DATE_FORMAT(credit_date, '%m-%Y') desc ) b ON a.month_starting = b.month_starting
ORDER BY a.month_starting

1 Ответ

0 голосов
/ 12 сентября 2018

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

Сначала добавьте DATE(DATE_FORMAT(order_date, '%Y-%m-01')) month_starting к вашему первому запросу SELECT и DATE(DATE_FORMAT(credit_date, '%Y-%m-01')) month_starting к второму запросу SELECT.

Затем оберните два запроса во внешний запрос с помощью JOIN, как это.

 SELECT a.month, a.totalSales, b.totalCredit
 FROM ( your first query ) a
 JOIN ( your second query ) b ON a.month_starting = b.month_starting
ORDER BY month_starting

Хитрость заключается в том, чтобы понять, что запросы можно использовать, как если бы они были таблицами , заключив их в (query) alias

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...