2014-12-02 66 views
0

我在裏面寫上每個訂閱我的雜誌賣表,像這樣:現在計數續費出售

USERID | DATE | 

31 | 2011-09-22 | 
54 | 2011-09-22 | 
59 | 2011-09-23 | 
11 | 2011-10-02 | 
88 | 2011-10-05 | 
31 | 2011-10-06 | 
17 | 2011-10-12 | 
54 | 2011-10-15 | 
31 | 2011-11-05 | 
54 | 2011-11-12 | 

,用於統計目的,我需要有一個結果,我在其中每個月都會看到我已售出多少訂閱以及一次購買多少用戶。

舉例來說,如果我們看一下在上面的DATAS,我應該有likie這一個結果:

DATE | SOLD | RENEWAL 
09 | 3 | 0 
10 | 5 | 1 
11 | 2 | 2 

我可以組訂閱每月的銷售,但我不能添加的「換新」信息。

SELECT COUNT(*) AS sold, MONTH(date) FROM table_sold WHERE date >= CURDATE() - INTERVAL 13 MONTH GROUP BY YEAR(date) , MONTH(date) ORDER BY date ASC LIMIT 1,15 

這樣我只有這樣一個結果:

DATE | SOLD 
    09 | 3  
    10 | 5 
    11 | 2 

我試過幾個選項,與子查詢,工會等,但沒有成功。 需要考慮的是該表有70.000個條目,並且具有硬掃描的查詢可能是個問題。

在你看來有沒有一種方法在MySQL或我已經採取這個想法,使其在PHP?

+0

您是否需要處理某人讓其失敗,然後再重新訂閱的情況?這會算作是更新還是新的子?如果你不需要處理續訂,那麼你可以只計算每個ID('n')有多少點擊,然後是1次出售+(n-1)續約 – 2014-12-02 15:55:03

回答

1

這是一個想法。看看每個用戶的第一次約會。然後計算每月不是第一次約會的續訂時間:

select year(date), month(date), count(*) as sold, 
     sum(case when date <> firstdate then 1 else 0 end) as renewals 
from subscriptions s join 
    (select userid, min(date) as firstdate 
     from subscriptions s 
     group by userid 
    ) su 
    on s.userid = su.userid 
group by year(date), month(date) 
order by year(date), month(date); 
+0

你是一個天才,你知道嗎? 它工作得很好,謝謝!!!!! – user3670605 2014-12-02 16:25:02