MySQL5の質問ですアクセス解析を自作しています。



あるサイトへのアクセス情報を格納したテーブルがあります。

テーブル名:access
フィールド:ip,page

(*具体的な格納情報をコメ欄に書いています)

ここから、各ページへのユニークアクセス数を産出して、以下のテーブルに格納したいです。

テーブル名:unique
フィールド:page,unique

SQLとPHPでこの処理を実現したいと思います。
ストアドプロシージャは知識が全く無いのでPHPがいいです。

自分なりに考えた流れとしては、
AページのIP数を重複を除いてカウント(これがunique数になる)
Bページ、Cページと同じように処理・・
でしょうか。

一時表など使えば出来るような気もしますが、使ったことが無いので具体的な方法が思い浮かびません。
ちょっと複雑になると思いますのでポイントは500以上は用意します。

みなさんよろしくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:2007/08/16 07:38:38
  • 終了:2007/08/17 19:26:58

ベストアンサー

id:KUROX No.3

KUROX回答回数3542ベストアンサー獲得回数1402007/08/16 14:38:04

ポイント200pt

>出来ました!自分で作ったSQLはエラーになっていたんですが

>「as aaa」が無かったからでした。

>このままだとポイントが進呈できないので、回答欄に何か

>書き込んで頂けないでしょうか?よろしくお願いします。

お気遣いどうもありがとうございます。

お言葉に甘えさせていただきます。

id:tokyosmash

コメント欄での回答ありがとうございました。サブクエリを覚えるきっかけになったのでありがたい回答でした。


ポイントについて)

SQL自体はkunyamiさんのSQLの方がシンプルなのでポイント配分に迷ったのですが、色々考えた結果いるかはKUROXさんで、ポイントをkunyamiさんに少しだけ多目に配分する事にしました。



みなさんありがとうございました。これで締め切らせていただきます。大変有益な質問になりました。

2007/08/17 19:26:07

その他の回答(2件)

id:kunyami No.1

kunyami回答回数24ベストアンサー獲得回数42007/08/16 09:06:30

ポイント150pt

きちんと確認してないですが・・・

select page, distinct(ip, page)

from access

group by page

でいかがでしょうか?

id:tokyosmash

回答ありがとうございます。

正確には

select distinct(ip, page) from access group by page

のようですが、これだとcountが無いので質問の意図とは遠い結果になってしまいます。


コメント欄でKUROXさんに回答いただきましたが、

SELECT page,count(*)

FROM (SELECT ip,page

FROM access

GROUP BY ip, page) as aaa

GROUP BY page

で完璧にいけるようです。

後はこれをuniqueテーブルにINSERTするだけですが、そちらは自力で出来ました。


出来れば締め切りたいのですがKUROXさんから回答欄に頂いていないので、そちらを待ちたいと思います。

質問は解決しました。みなさんありがとうございました。

2007/08/16 09:19:22
id:kunyami No.2

kunyami回答回数24ベストアンサー獲得回数42007/08/16 10:15:47

ポイント150pt

あらら、書き間違いでした。

select page, count(distinct ip, page)

from access

group by page

これではいかがでしょう?

id:tokyosmash

回答ありがとうございます。

こちらでも同じ結果になるようですが、シンプルでいいですね。

実行速度も微妙に速かったりするのでしょうか。こちらのSQLでいきたいと思います。

2007/08/17 19:22:29
id:KUROX No.3

KUROX回答回数3542ベストアンサー獲得回数1402007/08/16 14:38:04ここでベストアンサー

ポイント200pt

>出来ました!自分で作ったSQLはエラーになっていたんですが

>「as aaa」が無かったからでした。

>このままだとポイントが進呈できないので、回答欄に何か

>書き込んで頂けないでしょうか?よろしくお願いします。

お気遣いどうもありがとうございます。

お言葉に甘えさせていただきます。

id:tokyosmash

コメント欄での回答ありがとうございました。サブクエリを覚えるきっかけになったのでありがたい回答でした。


ポイントについて)

SQL自体はkunyamiさんのSQLの方がシンプルなのでポイント配分に迷ったのですが、色々考えた結果いるかはKUROXさんで、ポイントをkunyamiさんに少しだけ多目に配分する事にしました。



みなさんありがとうございました。これで締め切らせていただきます。大変有益な質問になりました。

2007/08/17 19:26:07
  • id:tokyosmash
    字数の関係で質問文はシンプルにまとめました。あれだけの情報だと質問の意味がわかりづらいかもしれないので、こちらで出来るだけ具体的に記述します。

    質問文の処理でやりたい事は「ページごとのユニーク数の算出」です。A・B・Cといったそれぞれのページに何人の人間がアクセスしたかを知りたいのです。

  • id:KUROX
    回答かけない(^^;のでこちらに。

    SQL文でやる。一番最初に書かれているテーブルで
    IPアドレスとページでGroup Byをかけて一気に取得

    SELECT FIRST(IP)、FIRST(PAGE)、count(*)
    FROM テーブル
    Group By IP,PAGE
  • id:tokyosmash
    テーブルaccessのデータはこのようになっています
    111.11.11.1 A
    222.22.22.2 A
    111.11.11.1 B
    222.22.22.2 A
    333.33.33.3 A
    333.33.33.3 A


    A/Bというのはページ名だと思ってください。

    Aには5回のアクセスがありますがユニークは3になります。
    Bのユニークは1です。
    「111.11.11.1」はAとBの両方にアクセスしていますが、違うページなので、それぞれのページのユニークと判断します。

    このように「ページごと」のユニークを算出して、uniqueテーブルにデータを格納します。
  • id:KUROX
    たぶん、私の書いたSQL文で、期待通りの結果がでると
    思いますが、MySQL5にたいして直接SQL文を発行する
    ツールとかでSQLの妥当性を確認できないのですか?
  • id:KUROX
    SELECT IP、PAGE、count(*)
    FROM テーブル
    Group By IP,PAGE

    いい加減ですいません、寝ぼけてました。


  • id:tokyosmash
    丁寧にありがとうございます。
    MySQLに直接SQL打ってみました。

    ただ、このSQLだと「ページごとのIPユニーク」では無いと思います。ipとpageがセットになったユニークなら算出されました。
  • id:tokyosmash
    SELECT ip,page
    FROM access
    GROUP BY ip, page

    これで取得したデータに、

    SELECT page,count(*)
    FROM access
    GROUP BY page

    で再クエリすれば「ページごとのIPユニーク」は算出できると思いました。MySQL5なのでサブクエリは使用可能ですが、方法がわかりません。
  • id:KUROX
    SELECT page,count(*)
    FROM (SELECT ip,page
    FROM access
    GROUP BY ip, page) as aaa
    GROUP BY page

    ORACLEしか分からんのですが、こんな感じは
    標準SQLじゃない?
  • id:tokyosmash
    出来ました!自分で作ったSQLはエラーになっていたんですが「as aaa」が無かったからでした。

    このままだとポイントが進呈できないので、回答欄に何か書き込んで頂けないでしょうか?よろしくお願いします。


    これで「ページごとのIPユニーク」を抽出するSQLは出来たので、それをuniqueテーブルに格納したいと思います。引き続き回答をお待ちしております。
  • id:KUROX
    as というのは、別名をつけるときに使います。
    SELECT ID as ID_A FROM TABLE

    これだとフィールド名としてID_Aという別名で取得できます。

    今回は、aaaって適当な名前ですけど、それらしいテーブル名
    がよいです。本当に適当ですいません(^^;;;;;

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません