MySQLで質問です。


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


回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2008/05/24 09:31:06
  • 終了:2008/05/31 09:35:02

回答(3件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/05/24 10:29:39

ポイント27pt

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

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


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

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

id:makocan

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

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

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

はい

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

はい

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

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

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

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

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

2008/05/24 15:18:00
id:pahoo No.2

pahoo回答回数5960ベストアンサー獲得回数6332008/05/24 17:12:36

ポイント27pt

ここでは、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に書き戻すのではなく、テキストファイルに書き出した方が良いと思います。


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


参考サイト

id:chuken_kenkou No.3

chuken_kenkou回答回数722ベストアンサー獲得回数542008/05/25 17:03:46

ポイント26pt

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

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

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

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

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

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

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

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

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

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

 あるのですか?

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

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

コメントはまだありません

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

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

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

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