@vostotskiy

Как правильно сформулировать mysql запрос для выборки со сложным условием?

Здравствуйте. Посоветуйте, пожалуйста, в каком направлении копать составление запроса.
Есть таблица для платежей с полями id, plan_id, created_at, summ.
Нужно посчитать количество новых платежей за последние N дней. Новым считается платеж(привязанный к plan_id), который был создан за последние N дней, при этом других платежей за более ранний период (cвязанных с тем же plan_id) не должно быть.
Буду благодарен за любой совет.
Пока реализовал в таком формате
SELECT COUNT(*)
FROM (
SELECT (
SELECT COUNT(*) FROM payment t  WHERE s.plan_id = t.plan_id AND t.created_at  BETWEEN DATE_SUB(CURDATE(), INTERVAL 10 DAY) AND CURDATE() ) as 'count_in' ,
(
SELECT COUNT(*) FROM payment t2  WHERE s.plan_id = t2.plan_id AND t2.created_at < DATE_SUB(CURDATE(), INTERVAL 10 DAY)  ) as 'count_before' 
FROM payment s
GROUP BY s.plan_id 
HAVING (count_in = 1) AND (count_before=0)
)as new;

Здесь -count_in -количество платежей одного plan_id за требуемый период
count_before -количество платежей до указанного периода
Далее -группировка по plan_id. И все это еще раз вложено в алиас new для подсчета количества plan_id с указанным условием( 1 платеж за выбранный период и отсутствие платежей за более ранние периоды)
Если что сделал не так, подскажите, пожалуйста(как можно сделать лучше или правильнее).
Заранее спасибо
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT COUNT(*)
  FROM (
    SELECT 1
      FROM `payment`
      GROUP BY `plan_id`
      HAVING MIN(`created_at`) >= CURDATE() - INTERVAL 5 DAY
        AND COUNT(*) = 1
  ) AS `t`
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vshvydky
я не уверен, что будет лучше
посмотрите в сторону
SELECT DISTINCT id, COUNT(id) 
FROM payment
WHERE 
   created_at  BETWEEN DATE_SUB(CURDATE(), INTERVAL 10 DAY) 
AND 
   CURDATE() AND id NOT IN 
(SELECT DISTINCT id FROM payment WHERE  created_at < DATE_SUB(CURDATE(), INTERVAL 10 DAY) )
GROUP BY ID

Можно попробовать нечто подобное. Возможно написанный код содержит ошибки, написан без синтаксиса, таблицы и тестирования.
Ответ написан
Ваш ответ на вопрос

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

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