dklight
@dklight
php кодер - level 2.5

Как оптимизировать запрос?

Есть запрос:

select ( select SUM(e.summ)
        from myevents.event as e
          LEFT JOIN myevents.type as t on t.id = e.type
        WHERE (e.dtr >= '2018-04-01') AND (e.dtr <= '2018-04-31') AND
              (t.id = 1))  as 'dohod',
        (select SUM(e.summ)
        from myevents.event as e
          LEFT JOIN myevents.type as t on t.id = e.type
        WHERE (e.dtr >= '2018-04-01') AND (e.dtr <= '2018-04-31') AND
              (t.id = 2)) as 'rashod';

select ( select SUM(e.summ)
         from myevents.event as e
           LEFT JOIN myevents.type as t on t.id = e.type
         WHERE (e.dtr >= '2018-05-01') AND (e.dtr <= '2018-05-31') AND
               (t.id = 1))  as 'dohod',
       (select SUM(e.summ)
        from myevents.event as e
          LEFT JOIN myevents.type as t on t.id = e.type
        WHERE (e.dtr >= '2018-05-01') AND (e.dtr <= '2018-05-31') AND
              (t.id = 2)) as 'rashod';

Он находит сумму доходов и расходов за 1 месяц, точнее первый запрос находит. Второй запрос делает то же самое, но за следующий месяц. Интересуют пути оптимизации подобных запрос. Скорее всего есть способы, где можно 1 запросом получить те же данные за несколько месяцев. Нужна наводка

И можно ли как нибудь избавиться от вложенных запросов, чтобы получить то же самое?
Любые направления на хорошие ссылки и/или книги (или другое) для изучения подобных вопросов приветствуются
  • Вопрос задан
  • 92 просмотра
Решения вопроса 2
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
как то это прям уныло.

1. Вы джойните таблицу type по id и тут же по нему фильтруете - фильтруйте сразу по event.type, таблица type вообще не нужна

2. Если нужно за несколько месяцев, то с точки зрения быстродействия, самое быстрое решение выборка
select DATE_FORMAT(event .dtr,"%Y-%m"), event.type, sum(event.summ),
from event 
where event  dtr between ... and ...
group by DATE_FORMAT(event .dtr,"%Y-%m"), event.type, sum(event.summ)

и дальше на любом ЯП это обрабатывать.
Ответ написан
Не проверял, но что-то типа такого можно сделать:
SELECT
	SUM( CASE WHEN `type` = 1 THEN `summ` END) 'dohod', 
	SUM( CASE WHEN `type` = 2 THEN `summ` END) 'rashod',
	MONTH(dtr) 'month'
FROM myevents.event
WHERE 
  YEAR(dtr) = 2018
  AND `month` BETWEEN 4 AND 5
GROUP BY `month`


Читать документацию MySQL:
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы