SQL для подсчета пассивных подписчиков между заданными датами - PullRequest
0 голосов
/ 11 февраля 2012

Я работал всю ночь, чтобы закончить статистическую часть проекта, над которым я работаю. Одна часть этой части статистики состоит в том, чтобы показать администраторам, какие подписчики не продлевали подписки между указанными датами.

ТАБЛИЦА

- members -
id (int)
hasSubscription (enum 1,0)

- subscriptions -
id (int)
member_id (int)
endDate (date)
active (enum 1,0)

Пример

SELECT COUNT(*) FROM members as m 
INNER JOIN subscriptions as s ON s.member_id = m.id
WHERE
s.endDate BETWEEN '2011-01-01' AND '2011-02-01'
s.active = 0
m.hasSubscription = 1

Обычно так я могу подсчитать участников, у которых подписки завершены, и их подписка была завершена между указанными двумя датами.

Мне нужно иметь количество участников, у которых подписка закончилась между 2 датами, но у нее больше нет активных подписок.

На данный момент я больше не могу мыслить прямо. Я буду очень рад, если вы поможете мне.

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

Похоже, вам нужно что-то вроде этого:

SELECT  COUNT(*) 
FROM    members as m 
        INNER JOIN subscriptions AS s 
            ON s.member_id = m.id
WHERE   s.endDate BETWEEN '2011-01-01' AND '2011-02-01'
AND     s.active = 0
AND     m.hasSubscription = 1
AND     NOT EXISTS
        (   SELECT  1
            FROM    Subscriptions a
            WHERE   a.MemberID = m.ID
            AND     a.Active = 1
        )
0 голосов
/ 11 февраля 2012

Было бы интересно узнать, как планы выполнения зависят от этих двух запросов.Исходя из прошлого опыта, эта версия с LEFT JOIN должна быть более эффективной -

SELECT  COUNT(*) 
FROM    members as m 
INNER JOIN subscriptions AS s 
    ON s.member_id = m.id
    AND s.endDate BETWEEN '2011-01-01' AND '2011-02-01'
    AND s.active = 0
LEFT JOIN subscriptions a
    ON a.member_id = m.id
    AND s.endDate < a.endDate
    AND a.active = 1
WHERE m.hasSubscription = 1
AND a.member_id IS NULL
...