• 締切済み

カウント数の抽出

こんばんは。お世話になっております。 現在、PHPにてレンタルサーバ上にあるMySQL(4.0)を用いながらサイトを運営しておりますが、以下のような動作をさせたく考えております。 no id  date     ip 1  21 2007-09-27 162.18.64.2 2  10 2007-09-27 101.15.69.6 3  12 2007-09-27 122.18.64.9 4  21 2007-09-27 121.16.62.1 5  10 2007-09-27 172.17.64.2 6  32 2007-09-27 199.11.65.6 と、イメージ的に上記のようなテーブルがあり、アクセス数をカウントしているのですが、id別にアクセス数の多いもの順(※1)から並べ替えすることは出来るものの、id毎に呼び出した際、それが※1で並び替えた場合、上位から何番目に当たるのかを知るには、どのようなスクリプトになるのでしょうか? 色々と思いつくことはあるものの、どれも上手くいかずに、諸先輩方々からのお知恵を頂戴したく投函させて頂きました。お忙しいとは存じますが、アドバイスいただければ幸いに思います。宜しくお願いいたします。

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

idの個数を数えて、順位をつけるということですね? ここで必要なデータはidだけです。 ほかのnoやdate,ipはとりあえず考えず、以下のようにしてみます。 create table `access` (`id` int); insert into `access` values (1),(1),(2),(2),(2),(2),(3),(4),(4),(4),(5),(5); これをアクセス順に並べるためには select `id`,count(*) as count from `access` group by `id` order by count desc; として id count 2 4 4 3 1 2 5 2 3 1 となります。 id=1,5が同じcountなのでランク付けするときには 同じランクにしたいと思います。 4.0ではサブクエリが微妙なのでテンポラリを使います。 まずは全体の要素数を変数@allにとっておきます。 その後要素数をカウントするテンポラリを二つ用意して外部結合します。 select @all:=count(distinct `id`) from `access`; create temporary table `t1` select `id`,count(*) as `c1` from `access` group by `id`; create temporary table `t2` select count(*) as `c2` from `access` group by `id`; select `id`,`c1` as count,@all -count(*) +1 as `rank` from `t1` inner join `t2` on `c1`>=`c2` group by `id` order by `rank`; 結果は id count rank 2  4  1 4  3  2 1  2  3 5  2  3 3  1  5 前回も書きましたが 全体の要素数(@all)-自分以下の数値(count(*))+1 が自分のランクになります。

32aoi
質問者

お礼

yambejp様 こんにちは。お休みのところ詳細なご指導を有難う御座います! さきほど、登録アドレス宛に、回答を頂いたとのメールがあり、拝見させていただいておりますが、只今、内容を試す環境ではないため、取り急ぎお礼を伝えたく書き込ませていただいております。 改めて、補足欄にご報告をかねてご連絡させて頂きたいと思います。 有難う御座いました!

全文を見る
すると、全ての回答が全文表示されます。
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

いまいち仕様がわかりづらいのですが・・・ >それが※1で並び替えた場合、上位から何番目 の「上位」とはid毎の個人内の上位からなのか、全体での上位なのかで やり方が全然ちがうと思います。 ランクを取るときに頭から単純に序数をつけていけば楽ですが、 実際には同じランクの要素もでてきますのでそれを同位したい場合、 全体の要素数-自分以下の数値+1が自分のランクになります。 (ちょっとわかりづらいかもしれませんが・・・)

32aoi
質問者

お礼

yambejp様 こんばんは。お世話になっております。 質問に言葉足らずなところがあったようで申し訳ありません。 質問にある、※1とは、yambejp様の仰るように、全体での上位順に呼び出した状態を指しております。 先のmoon-night様が仰るように、PHPにて処理した方が宜しいのでしょうか?PHPにしろSQLにしろ、考えてはいるものの、なかなか思うような流れをつかめずに居る次第で御座います。 引き続き、ご指導いただければ幸いに思います。 宜しくお願い申し上げます。 追伸:yambejp様が仰る「要素」を、今一度詳しく教えては頂けませんでしょうか?現在のselect文はyambejp様ご指摘のように、頭から単純に序数をつけている方法を取っているので・・・。

全文を見る
すると、全ての回答が全文表示されます。
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

SQLだけでやろうとすると面倒そうなので、 米1までSQLで出してからPHPで回したほうが早いと思います。

32aoi
質問者

お礼

moon_night様へ はじめまして、こんばんは。 早速のアドバイスを有難う御座います。 質問にある、※1をSQLで抽出した後、PHPにて出力した方がいいとのことですが、どんな流れにしたら良いでしょうか?考え方だけでもご指導いただけたら幸いです。 宜しくお願い申し上げます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 3つの表の結合から、2つの表のみのカウント数

    PHPとMySQLにて図書館のプログラムを作成しています。 今回の問題の箇所で必要な表は3つです。 関係のある項目のみ記述します。 bookテーブル    (isbn,本番号) reviewテーブル   (isbn,評価) rentalテーブル   (本番号) グループ化として、isbnでグループ化しています。 ページに必要な情報は、3つの表から必要なため、それぞれを外部結合させています。 今回、そのページでは、ソート機能としてプルダウンメニューからソートしたい項目を選択すると、それに応じてソートさせています。 五十音順、評価順、レンタル数順、新着順とありますが、その中でレンタル数のみうまくいきません。 レンタル数のみであれば、bookテーブルとrentalテーブルのみでカウントすれば正常に結果が得られますが、そこに外部結合でもう1つ表が加わっていることが原因で、正しい結果が得られません。 何か方法はありますでしょうか?、

  • 3つのテーブルからのデータ抽出

    こんばんは。 久しぶりの投函ですが、以下の内容を処理することが出来ずに悩んでおります。 テーブルを結合して・・というのは、分かるのですが、ネットで検索してもその殆どが2つのテーブルに関するものなので、その設定が出来ずに時間を費やしている状況です。 お忙しい中恐縮ですが、アドバイスなど頂戴できたら幸いです。 table:main id name 1 たかし 2 しげる 3 あけみ 4 ひろみ 以下のtableのid、p_idは、mainTBのidを指しています。 table:frend no id p_id 1 2  3 2 4  1 3 1  2 4 2  4 5 3  1 以下のtableのidは、mainTBのidを指しています。 table:comment no id naiyou 1 3 よろしく 2 4 こんにちは 3 2 おめでとう 4 3 楽しい 以上のテーブルが存在し、mainのid、しげるを検索した際、 frendTBに参照し、しげる(id=2)に該当するp_id(この場合、3、4)を探し、且つcommentTBにあるidである、naiyouを表示したいと考えてます。 実際の表示はこんな感じ・・ しげる(id=2)を検索した場合、 よろしく  あけみ こんにちは ひろみ 楽しい   あけみ 以上、アドバイスだけでも結構です。ご指導のほど宜しくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • アクセス数をカウントするURL

    ロリポップで携帯サイトを運営しています。 アクセス数を稼ぐためにランキングサイトに登録しているのですが、 参考⇒http://best100.jp/ (携帯ランキングサイト) ランキングサイトから自分のサイトに飛んできたアクセス数はOUT数として表示されています。 このOUT数を水増ししてるランキングサイトがとても多いのです。 正確なOUT数を把握するために、ランキングサイトに登録する際の自分のURLをcgiにしてアクセス数をカウントしたいのです。 URLをcgiにしている人を例にすると URL⇒http://oshiete1.goo.ne.jp/ best100.jpランキングに登録するURL⇒htp://http://oshiete1.goo.ne.jp/mati/index.cgi?id=best100jp ↑をクリックするとhttp://oshiete1.goo.ne.jp/に飛びます。 このようにランキングごとにindex.cgi?id=○○ idを作成して、それぞれの正確なout数を把握したいです。 どのようにしたらこのようなcgiを作成できますでしょうか? ご存知の方は教えて頂けると幸いです。 よろしくお願い致します。

    • 締切済み
    • CGI
  • 複数のテーブルのレコードをカウントする方法

    2つのテーブルのレコード数をカウントする方法を教えてください。 $sql = "SELECT * FROM テーブル1 and テーブル2"; $res = mysql_query($sql,$myLink); $num_k = mysql_num_rows($res); こんな感じでカウントできるかと思ったのですが出来ませんでした。 宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • テーブルのカウントについて

    office2000を使用しています。 MS-ACCESSのテーブルにて、新規項目(行)を追加した際に自動でNO(件数)をカウントupしたいのですが、どうすればよいのでしょうか? オートナンバーを使用すると、再編成しないとカウントがずれています。

  • クエリでカウントしつつ、チェックボックスを

    クエリでカウントしつつ、チェックボックスを使えるように(更新できるように)したいです。 アクセス2003です。 テーブル1(主キーなし) 名前   退職(Yes/No型) 佐藤   No 田中   No 佐藤   No から下のクエリを作りました。 SELECT テーブル1.名前, Count(テーブル1.名前) AS 名前のカウント, テーブル1.退職 FROM テーブル1 GROUP BY テーブル1.名前, テーブル1.退職; 結果、 名前 名前のカウント 退職 佐藤   2        No 田中   1        No となりますが、退職フィールドにチェックを入れることは出来なくなってしまいます。 カウントしつつ、更新可能なクエリにしたいのですが不可能でしょうか? 最終的には、このクエリ1をレコードソースとしてフォームに表示させたいです。 ご教示よろしくお願い致します。

  • フィードに条件をつけた場合のカウント数

    現在、PHPとmysqlで名簿を作成していまして、50音別に表示したいと思っていますが、 「あ」で始まる人のカウント数(データ数)をどのように取得したらいいのか悩んでいます。 テーブル全体のデータ数を取得するには select count(*) from table_name という感じだと思うのですが、 特定のフィールド(ふりながフィールド)に対して条件(「あ」で始まる人)をつけてデータ数を取得するにはどのようにしたらいいのでしょうか?

    • ベストアンサー
    • PHP
  • 外部結合とカウントができない!

    お世話になります。 ここ数日、外部結合とカウントを組み合わせたSQL が思うようにかけず大変悩んでいます。 学校・クラス・生徒テーブルをJOINして、 合否判定数を求めたいのですが、 期待する結果になりません。どなたか助けて下さい>< ポスグレ+PHPです。 事情によりプログラム側でカウントできないので、 SQLで一気に取得しなければならないのがネックです。 以下3テーブルと期待する結果テーブルです。 ///////////////////////////////////////////////// 学校テーブル -------------- ID   学校名 -------------- 1   あああ 2   いいい -------------- クラステーブル ---------------------------- ID   学校ID   クラス名 ---------------------------- 1     1     6-1組 2     1     6-2組 3     2     5-1組 ---------------------------- 生徒テーブル ---------------------------------------------------- ID   学校ID   クラスID   生徒名   合格判定 ---------------------------------------------------- 1     1      1     AAAAAA    TRUE 2     1      1     BBBBBB    FALSE 3     1      2     CCCCCC    TRUE ---------------------------------------------------- 期待する結果 ---------------------------------------- ID   学校名   受験数   合格数 ---------------------------------------- 1    あああ    3     2 2    いいい    0     0 ---------------------------------------- ///////////////////////////////////////////////// どなたか助けてやってくださいm(_ _)m

  • レコード数を重複を省いて取得するには

    テーブルAccessにあるフィールドuser_idの値が$userであるフィールド数を取得したいのですが、 同テーブルのフィールド ip もしくは uid の値が重複しているものを省いた数を取得したいです。 ipとuidの値が他のフィールドに存在していないuser_idだけカウントしたいです。 このようなカウントをすることは可能でしょうか。 クエリ文をご教示頂けると幸いです。 よろしくお願い致します。

  • 複数のテーブルからのデータ抽出

    こんばんは。お世話になっております。 テーブル(A) id | no | image -------------------- 1 | みかん| aaa.gif 2 | なし | bbb.gif 3 | いちご| ccc.gif テーブル(B) m_id | t_id ---------------- 1  |  3 2  |  2 1  |  2 というようなテーブルがあるのですが、テーブルBのm_id、1を検索した際、t_idを抽出、かつそのt_idと同じ番号であるテーブルAのimageをも抽出したいと考えています。 結果としては、以下のような感じ。 3  ccc.gif 2  bbb.gif $m_id =$_GET["id"]; //途中省略 $sql= "select * FROM B INNER JOIN A ON B.m_id = A.id WHERE m_id = '$m_id'"; としているのですが、テーブルBのt_idは検索されるものの、テーブルAのimageは全てaaa.gifと返ってきてしまいます。 先日、こちらでテーブルの正規化として、データを分散させる考え方をお教え頂き、早速それに習って構成してみたのですが、思うようにデータを抽出出来ずにアドバイスを頂戴したく投函させていただきました。 先のソースで可笑しな点などの忠告や、アドバイスなど頂戴できれば幸いです。宜しくお願い致します。

    • ベストアンサー
    • MySQL
このQ&Aのポイント
  • スマホのiPrint&Scanを使用してスマホ内の文書を印刷しようとした際、複合機のパスワード入力が求められ、入力後には接続が成功したが、印刷ができない問題が発生している。
  • 別のスマホではパスワードの入力も不要で問題なく印刷ができているが、このスマホでは接続ができない状態が続いており、設定画面には「情報の接続がありません」と表示されている。
  • 詳しいエラーの内容や試したことは記載されていないため、解決策を提案する際にはさらに詳細な情報が必要となる。
回答を見る