2011-12-05 11 views
0

を見つける:MySQLのクエリは、私は次の表を持って毎月のアクティブユーザー

CREATE TABLE account (
    account_id bigint(20) NOT NULL AUTO_INCREMENT, 
    time_start datetime NOT NULL, 
    time_end datetime DEFAULT NULL, 
    PRIMARY KEY (account_id), 
    KEY idx_start (account_id,time_start), 
    KEY idx_end (account_id,time_end) 
) ENGINE=MyISAM 

は、どのように私は毎月にログインどのように多くのユーザーを見つけるためのクエリを記述することができますか?

過去90日間にaccount_idの数が月別にテーブルグループにいくつあるか調べたいと思います。月ごとのグループとは、30日ごとを意味します。たとえば、2011-12-05から2011-11-06、2011-12-04から2011-11-05まで、最後の90日間などです。

答えて

2

YEAR()MONTH()で、日時フィールドから自明に年月を取得できます。しかし、あなたの期間は月の境界で開始/終了と一致しないので、その変換を処理するためにいくつかの醜い検索ロジックが必要になります。

stored function/procedureを書いて、定期的な日付/時刻を「会計」の日付時刻に変換してから、よりクリーンに見えるようにする必要があります。プロシージャを完了したら、会計期間の計算は間違いなく他の場所で繰り返されるため、どこでも再利用できます。

1

このクエリでは、次の2つのことを前提としています。 1)あなたの月ロジックが四角形になっています(@ Marcの投稿を参照)。 2)time_startは、ユーザーが「ログオン」している時間です。

SELECT COUNT(*), month 
FROM account 
GROUP BY month 
HAVING time_start > ADDDATE(CURDATE(),- INTERVAL 90 DAY); 

それがうまくいくかどうか試してみてください。私はそこに否定的なADDDATEビットがあるかどうか分からないので、date and time functionsのMySQLのリファレンスページをチェックアウトする必要があります。

+0

を試してみてください。しかし、SOFは誰もがスプーンで食べられる場所にすべきではありません。さらに、この質問は明らかに重複しており、既に何百回も尋ねられています。代わりに、重複を報告したはずです。 – Gajus

+0

@Guy私は彼にすべての答えを与えなかった。私は彼にルックアップの参照と同様に "一緒に混乱する"出発点を与えた。ただ助けてくれるようにしよう。 – Aaron

1

は明らかにその答えが正しいか、この

select count(distinct account_id) 
from account 
where 
time_start >= date_sub(now(), interval 90 day) 
group by 
floor(datediff(now(), time_start)/30) 
関連する問題