人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLで質問です。

count,rankingというカラムを持ち
クリックされた数をcountに入れ、
それを参考に、クリック数の多い順に、ランキングを付け
それをrankingカラムの値に入れていきたいのですが
どうも上手くいきません。
対策方法はありませんでしょうか?




●質問者: makocan
●カテゴリ:インターネット ウェブ制作
✍キーワード:カラム クリック ランキング SQ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●27ポイント

コメント欄に書き込めないので、回答欄にて失礼します。

まずは、要件を確認させてください。


  1. MySQLのSQLのみで実装するのですか? それとも他の開発環境(PHPなど)を併用しますか?
  2. そのカラムを含むレコードは、クリック数を計測するコンテンツ単位にあると考えていいですか?
  3. countには整数値が入るのですね?
  4. rankingには順位(1から始まる整数値)が入るのですか? それとも、たとえば上位100位までは 'A'とかいったカテゴリ文字列が入るのですか?
  5. 「どうも上手くいきません」とのことですが、具体的に何がどううまく行っていないのか示していただけると、回答しやすいです。

http://www.hatena.ne.jp/ URLはダミーです。

◎質問者からの返答

・MySQLのSQLのみで実装するのですか?

PHPを併用しますが、極力SQLで完結したい思いがございます。

・そのカラムを含むレコードは、クリック数を計測するコンテンツ単位にあると考えていいですか?

はい

・countには整数値が入るのですね?

はい

・rankingには順位(1から始まる整数値)が入るのですか? それとも、たとえば上位100位までは 'A'とかいったカテゴリ文字列が入るのですか?

1から始まる整数値となります。

・「どうも上手くいきません」とのことですが、具体的に何がどううまく行っていないのか示していただけると、回答しやすいです。

全くもって、対策が浮かばないため、全く出来ていない状況です。

※他データベースには、RANK()が存在したが分かったくらいです。


2 ● pahoo
●27ポイント

ここでは、PHP 4.x + MySQL 4.x でできる方法をご紹介します。


まず、テーブル名を contents、構造を下記の通りとします。

id 整数 各レコードに付番されたユニーク番号
count 整数 クリック回数
rank 整数 順位

PHP のロジックの流れだけご紹介します。

  1. PHP から "SELECT * FROM contents ORDER BY count ASC;" を実行する。
  2. ループでカラム情報を1レコードずつ取り出し、配列 $cont[] に格納する。このとき "$count[順位] = id" のように代入する。
  3. $count を foreach ループで参照し、1レコードずつ update していく。つまり、順位の値が $rank のとき、"UPDATE SET rank={$rank} WHERE id={$count[$rank]};" を実行する。

極力SQLで完結したい思いがございます

MySQL 5.x のストアドプロシージャを使えば、SQLだけで実装できます。これについては、どなたかに回答をお願いします。


ただ、上記のPHPを使う方法にせよ、ストアドプロシージャを使ったにせよ、このロジックではむやみにコスト(CPU時間)がかかります。全レコードをフェッチして、再び全レコードを update するためです。

順位については、リアルタイムで更新するものではないでしょうから、DBに書き戻すのではなく、テキストファイルに書き出した方が良いと思います。


回答回数の上限に達したので、これにて失礼します。


参考サイト


3 ● chuken_kenkou
●26ポイント

MySQLのバージョンは、何ですか?

MySQL 4.0以前、MySQL 4.1、MySQL 5.0以降で、操作性がかなり違ってきます。

(1)行を一意に識別できる情報が必要です。

(2)count列にクリック回数を格納するタイミングは、いつなのですか?

1回クリックされる度に、count列も更新するのですか?

それとも、一定の時間間隔で更新するのですか?

(3)ranking列にランキングを入れるタイミングは、いつなのですか?

count列が更新される度に、ranking列も更新するのですか?

それとも、一定の時間間隔で更新するのですか?

そもそも、テーブル中に頻繁に更新される可能性のあるランキングを、テーブル中に持つ必要が

あるのですか?

検索時に、ランキング付けして表示すれないいだけでは?

http://q.hatena.ne.jp/だみー

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ