Как посчитать значение по двум датам и сгруппировать по одной?

Привет.

И так, есть таблица вида:

status_id, created_at, close_at
INT datetime datetime

Необходимо посчитать количество всех записей по дате создания created_at, посчитать по дате закрытия close_at, где статус равен status_id = 142 и всё сгруппировать по дате создания created_at при этом, где год создания больше 2017.

Считаем все :
SELECT COUNT(id) as `all`, DATE(l.created_at) as `date`
FROM table_1 l
WHERE YEAR(l.created_at) > '2017' GROUP BY `date`;


Всё отлично, данные корректны - теперь пытаюсь сджойнить сюда второе условие:
SELECT COUNT(id) as `all`, DATE(l.created_at) as `date`, s.success
FROM table_1 l
LEFT OUTER JOIN (SELECT SUM(1) as success, close_at FROM table_1 WHERE status_id = 142 GROUP BY close_at) s ON DATE(s.close_at) = DATE(l.created_at)
WHERE YEAR(l.created_at) > '2017' GROUP BY `date`, s.success;


Очень долгий запрос более 10 секунд и данные не корректны.

На самом деле написал какую-то дичь и не совсем понимаю, как такое можно провернуть в один запрос.
  • Вопрос задан
  • 61 просмотр
Пригласить эксперта
Ответы на вопрос 1
inside22
@inside22
Руслан вы бы по понятнее условие написали.

Не надо стараться запихать все в один запрос.

Лучше WHERE YEAR(l.created_at) > '2017' GROUP BY `date`; вместо этого использовать BETWEEN, я думаю. Поиграйтесь с EXPLAIN, посмотрите как выборка происходит, используются ли индексы или нет.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы