MySQLで日別・月別・年別・合計のWebアクセス数を集計するSQLクエリの書き方
この記事では、MySQLを使ってWebサイトへのアクセス数を「1日ごと」「1か月ごと」「1年ごと」、さらに「合計」で集計するSQLクエリの書き方を解説します。
前提条件: あらかじめ「DBNAME」という名前のデータベースと、「tableName」という名前のテーブルが作成されているものとします。
アクセス数を取得するクエリ
それでは、日別・月別・年別のアクセス数および合計を取得できるMySQLクエリを見ていきましょう。
クエリ例
SELECT COUNT(DISTINCT ip) FROM tableName WHERE create_at >= LAST_DAY(NOW()) + INTERVAL 1 DAY - INTERVAL 1 MONTH AND create_at < LAST_DAY(NOW()) + INTERVAL 1 DAY
クエリの仕組み
このクエリでは、DATETIME型の値を範囲指定して検索しています。具体的には、「今月の初日」から「翌月の初日の直前」まで(翌月の初日は含まない)という期間を対象にしています。
また、(create_at, ip) の2列からなる複合カバリングインデックスを作成しておくことで、クエリのパフォーマンスが大幅に向上します。インデックスさえ用意しておけば、このクエリで日別・月別・年別のアクセス数を効率的にカウントできます。
MySQLは必要な範囲のインデックスだけをスキャンすればよいため、テーブル全体を読み込むことなく高速に集計処理を行えます。
補足: このクエリは、DATETIME型だけでなくTIMESTAMP型のカラムに対しても問題なく動作します。
-
PHPで3つの文字列(年・月・日)を組み合わせて次の日付を計算する方法
PHPでは、カンマ区切りの3つの文字列(年・月・日)から、基準日よりも後の日付を求めたいケースがあります。このような場合、3重のループ(foreach)を使って年・月・日の組み合わせを順番に調べ、基準日より後の日付が見つかった時点でその値を変数に格納する方法が有効です。実装のポイントまず、explode() 関数を使ってカンマ区切りの文字列を配列に変換します。その後、年・月・日の3重ループで組み合わせを生成し、文字列として比較することで次の日付を特定します。見つかったら break 3 ですべてのループを抜け出すのがポイントです。サンプルコード以下がPHPのコード例です。<!DOCTYP
-
Javaで年・月・日から日付を取得する3つの方法(LocalDate、GregorianCalendar、SimpleDateFormat)
Javaでは、年・月・日の値から日付オブジェクトを作成する方法がいくつかあります。この記事では、代表的な3つの手法——java.time.LocalDateクラスのof()メソッド、java.util.GregorianCalendarクラス、そしてSimpleDateFormatクラス——の使い方を、サンプルコードと実行結果とともにわかりやすく解説します。 1. LocalDateクラスのof()メソッドを使う Java 8以降で導入された日時API(Date-Time API)に含まれるjava.time.LocalDateクラスのof()メソッドは、年、月、日を引数として受け取り、その