• ベストアンサー

抽出結果にランク付けを・・・と思い・・・。

初歩的なことですみません。 前回グループによる結果をランク付けの教えていただき出来ました。 大変感謝いたします! 他にも色々取ってみようと思いしていたんですけどできません。 アクセスポイントの多い方を順番にランク付けをするという単純な事なんですけど限界です。 $rs=$DB->execute("SELECT * FROM $k_user_table ORDER BY ac_point DESC"); $total=$result->RecordCount(); while($row =$result->FetchRow()) { $id[] = mb_convert_encoding($row['id'],'SJIS','EUC-JP'); } for($i=0; $i<10; $i++) { print("第".($i+1)."位:".$point[$i]."G"); } この様にとりました。 しかし何かが違うみたいです。 順番に並んでもポイントが取れてなかったり逆にポイントは順番に取れていてもランク付けできてなかったり・・・。 教えてください。まちがいはどこですか。

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • takapiii
  • ベストアンサー率55% (944/1707)
回答No.1

前回の質問を読んで無いので、良く分かりませんね…。 $id[] ってなんですか?使用してませんが? $point[$i] はいつ生成されたんですか? それともこの二つは同じ物で、単なる書き間違い?

iinnffoo
質問者

補足

分かりません(*^-^*) えっと・・・。 書き間違いです。 $id[] = mb_convert_encoding($row['id'],'SJIS','EUC-JP'); $point[] = mb_convert_encoding($row['point'],'SJIS','EUC-JP'); こう言う風にとってます。 と言うか単に抽出結果に番号を振りたいだけです/(°ё°)\ ややこしくしてしまったみたいですね! そこに for($i=0; $i<10; $i++) { print"$id[$i]"; print("第".($i+1)."位:".$point[$i]."G"); } と言う形にランキングにしたいのです。

その他の回答 (2)

  • dell_OK
  • ベストアンサー率13% (740/5645)
回答No.3

データを溜め込んでいる while ループ内で、 print mb_convert_encoding($row['id'],'SJIS','EUC-JP'); print mb_convert_encoding($row['point'],'SJIS','EUC-JP'); あるいは、 print $row['id']; print $row['point']; としたら、どのように表示されますでしょうか。 10位までなら、カウントをとって10で抜け出すように細工してください。 必ず10位以上あるのかどうかわかりませんが、 データが10件に満たない場合、 id も point もない "第位:G" だけが表示されてしまいます。

iinnffoo
質問者

お礼

こんにちわ。 ちょっと複雑に質問してしまいました。 point数の多い順に抽出し結果に順位を付けたいだけです。 商品を価格順に並べて番号を振るのと同じ感じです。 FetchRow())と言うより for($i=0; $i<10; $i++) のミスだと思います。 point数の多い順に抽出する事は出来てます。 そこにfor($i=0; $i<10; $i++) を使用し順位を付ける事が出来ません。 現在のソースになります。 while($row =$result->FetchRow()) { print mb_convert_encoding($row['point'],'SJIS','EUC-JP'); } こんな感じに取ります。 for($i=0; $i<10; $i++) { print("第".($i+1)."位:".$point."G"); } ここがループします。 >>データが10件に満たない場合、 件数は問題ないです。 >>としたら、どのように表示されますでしょうか。 以前と同じでした。

  • takapiii
  • ベストアンサー率55% (944/1707)
回答No.2

PEAR::DBを使っているんでしょうか… その辺りの説明が欲しいのですが、 $rs=$DB->query("SELECT * FROM $k_user_table ORDER BY ac_point DESC"); $total=$result->RecordCount(); while($row =$result->FetchRow(DB_FETCHMODE_ASSOC)) { $id[] = mb_convert_encoding($row['id'],'SJIS','EUC-JP'); $point[] = mb_convert_encoding($row['point'],'SJIS','EUC-JP'); } for($i=0; $i<10; $i++) { print"$id[$i]"; print("第".($i+1)."位:".$point[$i]."G"); } ではないかな…? ポイントはDB_FETCHMODE_ASSOCです(PEAR::DBならですが)

iinnffoo
質問者

お礼

お世話になります。 こんばんわ! ダメみたいでした。。。 現在は第1位~十位 と言う順位はきちんと付いています。 でもidが出ていない状況です。 for($i=0; $i<10; $i++) の場所もいろいろ変えてみたんですけど今度は逆に順位が取れなくなりidは正常に取れたりと言う状況です。 前の質問言うのは特に関係ないです。 これよりも複雑なグループによる抽出結果に順位を付けたいと言う質問です! ありがとうございましたっ。

関連するQ&A

  • 抽出結果に番号を振る方法について!

    こんにちわ! いつもお世話になっております。 以前にも質問してみたんですけど複雑にしてしまいやり直しになります。 例えばなんですけど商品価格を高い順番に並べてって言うのありますよね。 そう言う場合はカラム名 DESC これは分かるのですけど・・・。 そこに番号を振る事が出来ません。 1番 1000円 2番 980円 3番 850円 の様に 1 2 3 と言う事が出来ません。  抽出 while($row =$result->FetchRow()) { $point[] = mb_convert_encoding($row['point'],'SJIS','EUC-JP'); } 番号を振る for($i=0; $i<10; $i++) { print("第".($i+1)."位:".$point[$i]."G<br />"); } 現在のソースです。 個人的には for($i=0; $i<10; $i++) の記述のミスがどこかにあるのかな とも思います。 そもそもの for の使い方など書いてあるサイトはありませんか。

    • ベストアンサー
    • PHP
  • カウントの多い順に表示したい!

    お世話になっております。 これなんですけど。 k_id の多いランキング順に照合しています。 $result = $DB->execute("select distinct k_id from $k_intro_table"); $total=$result->RecordCount(); これの場合の抽出結果は一番上は一番多いk_id の表示はされているんですけど二番目から順不同になってしまいます。 1 50人 2 9人 3 15人 の様な感じです。 抽出した多い順番に ORDER BY を指定することは出来ますか。 多い順に並べる単なるランキングなんですけど出来ません。

    • ベストアンサー
    • PHP
  • 「PHP+MYSQLバージョンからの抽出結果をPHPファイルに表示できません」の質問になります。

    すぐに回答を! お世話になっております。 プログラミング初心者のiinnffooと申します。 またまた御助言頂きたく質問に至りました。 質問に入ります。 現在、TPLファイルを呼び出すPHPファイルを使ってMYSQLから会員さんへ送信したメールリストを最新順にDBから抽出したいと思っております。 補足になります。 今回TPLファイルを呼び出すPHPファイルを使っている理由はセッション等のソースが付いているのでそのまま使用しております。 (これが理由かもしれません、TPLのためのソースが抽出を邪魔しているかもです。) 今回の抽出結果を表示するファイルはPHPファイルになりTPLは使用しません。 現在 FATAL eorror RecordCount() が出ているのでソース間違いだと思うんです。 <?PHP //////////////////バックナンバー取得////////////////// $rs=$DB->query("SELECT * FROM ".$k_mail_timer." where sendtime <'$time' ORDER BY num DESC LIMIT 0,20"); $TOTAL=$result->RecordCount(); while($row =$result->FetchRow(DB_FETCHMODE_ASSOC)) ?> <TABLE> <TR><?PHP {$b_num[] = $row[0];} ?> </TR> <TR><?PHP {$row[1] = mb_convert_encoding($row[1],"SJIS","EUC-JP");} ?></TR> <TR><?PHP {$title[] = $row[1];} ?> </TR> <?PHP $smarty->assign("TOTAL",$TOTAL); $smarty->assign("title",$title); $smarty->assign("b_num",$b_num); if($_GET['k_outnum']<>"") { $b_num = $_GET['k_outnum']; ?> <?PHP //指定のデータを取得 $result = $DB->query("SELECT * FROM d_mail_timer where num='$b_num'"); while($row =$result->FetchRow(DB_FETCHMODE_ASSOC)) ?> <TABLE> <TR><?PHP {print_r($row["b_num"]);} ?> </TR> <TR><?PHP {print_r($row["title"]);} ?></TR> <TR><?PHP {print_r($row["msg"]);} ?> </TR> <TR><?PHP {$row[2] = mb_convert_encoding($row[2],"SJIS","EUC-JP");} ?> </TR> <TR><?PHP {$msg = $row[2];} ?></TR> <TR><?PHP {$url = $row[3];} ?> </TR> <?PHP ////■はサイトURLになります。 preg_match_all("/http:..■■■■■■.click_out.php.k_outnum=[0-9]+\&....sid=sid_fuyo/",$msg,$ms); foreach($ms[0] as $messe) { } preg_match_all("/k_outnum=[0-9]+/",$messe,$kid); foreach($kid[0] as $ki) { $ki = str_replace("k_outnum=","",$ki); trim($ki); } $url = $DB->getone("SELECT link_url_e FROM $k_koukoku_table where id='$ki'"); $msg = str_replace($messe,"",$msg); $smarty->assign("title",$title); $smarty->assign("msg",$msg); $smarty->assign("url",$url); }?> </TABLE> たぶん必要ないソースが結構あると思うんですけど・・・ 助けてくださいませんか(☆_☆)

    • 締切済み
    • PHP
  • [MYSQL/PHP]同着表示でのランキング表示

    現在、ランキングシステムを構築中です。 DBのポイント順にランキングとしてJSONで出力して、 5件目まで行くと、次の5件という風に更新するようなプログラムを作りたいと思います。 また、ポイントが同数のものは同ランクとして出力したいと思っております。 point table ----------------- | ID| POINT | ---------------— | 1 | 100 | | 2 | 50 | | 3 | 50 | | 4 | 20 | | 5 | 20 | | 6 | 10 | | 7 | 80 | | 8 | 70 | | 9 | 40 | |10 | 30 | ---------------— 1回目) http://localhost:8080/ranking/?offset=0 出力: [{"data":[{"rank":1,"id":1,"point":100},{"rank":2,"id":7,"point":80},{"rank":3,"id":8,"point":70},{"rank":4,"id":2,"point":50},{"rank":4,"id":3,"point":50}]}] 2回目) http://localhost:8080/ranking/?offset=5 [{"data":[{"rank":6,"id":9,"point":40},{"rank":7,"id":10,"point":30},{"rank":8,"id":4,"point":20},{"rank":8,"id":2,"point":20},{"rank":10,"id":6,"point":10}]}] 上記のような出力をするのに、必要なMYSQLとPHPの処理を考えているのですが、上手くいきません。 何かアドバイスお願い致します! また何かGETで引き渡すデータは必要でしょうか? $offset = $_GET[‘offset’]; $sql = ‘SELECT id, point FROM point ORDER BY point DESC LIMIT 5 OFFSET ’.$offset; $selectResult = mysql_query($sql ); $rank = 1; $last_score = null; $rank_count = 0; $i = 0; foreach($selectResult as $val){ $rank_count++; if($last_score != $val['point‘]){ $rank = $rank_count; $last_score = $val['point‘]; } $jsonArray[‘data'][$i]['rank'] = $rank; $jsonArray[‘data'[$i]['point'] = $val->point; $jsonArray[‘data'[$i]['userUid'] = $val->user_uid; $i ++; } return json_encode($jsonArray);

    • 締切済み
    • PHP
  • 間違いを教えてください。

    エラーが出てしまいます。 <? $test = $DB->getAll(&quot;SELECT nicname,point FROM &quot;.$k_user_table.&quot; order by point DESC LIMIT 0,3 &quot;); while($row =$test->FetchRow()) {  print $row[0]; print $row[1];  print &quot;<hr>&quot;; } ?>

    • ベストアンサー
    • PHP
  • Arrayってなんですか?

    自分は素人でPEARを使った抽出方法とその結果の整列方法を、システム開発者に聞きましたが、やってもまったくうまくいきません。 <? $test = $DB->getAll(&quot;SELECT nicname,point FROM &quot;.$k_user_table.&quot; order by point DESC LIMIT 0,3 &quot;); print_r($test); ?> 結局こちらで教えていただいた抽出部分の $test = $DB->getAll("SELECT nicname,point FROM ".$k_user_table." order by point DESC LIMIT 0,10 "); は出たのですが、改行もなくArray等と言う訳の分からない文字がやたら出て、かなり血圧が上がります。 $test = $DB->getAll("SELECT nicname,point FROM ".$k_user_table." order by point DESC LIMIT 0,10 "); で抽出した物を、 while($row =$test->FetchRow()) {  print $row[0]; print $row[1];  print &quot;<hr>&quot;; } の様な形で整列させるためにはどうしたらよいですか? 現在まで出来てるのは、 <? $test = $DB->getAll(&quot;SELECT nicname,point FROM &quot;.$k_user_table.&quot; order by point DESC LIMIT 0,3 &quot;); print_r($test); while($row =$test->FetchRow()) {  print $row[0]; print $row[1];  print &quot;<hr>&quot;; } ?> です。 と言うか、これで出るとシステム側から言われてますが、エラーばっかり出やがります。 パソコンの中に手を突っ込んでガリガリ揃えてやりたい気分ですね。 短気な私はそろそろやばいです。

    • ベストアンサー
    • MySQL
  • order by rank descでの並び替え。

    PHPからSQLITEのデータを並び替えて出力したいと思っています。 ~ $ord = $_REQUEST["ord"]; ~ if ($ord == 1) { $sql .= " order by rank desc"; // 並び順(人気) } else if ($ord == 2) { $sql .= " order by rank"; // 並び順(人気)逆順 } else { $sql .= " order by info.reg_date desc"; // 新人 } REQUESTによってrank順に並べ替えたいのですが、 SQLite Error select info.info_id as info_id,i1.value as info1 from info left join info_item i1 on info.info_id=i1.info_id where info.open=1 and i1.kind='info1' order by rank といったエラーがでてしまい行き詰っています。 原因のわかる方はいますでしょうか?

    • ベストアンサー
    • PHP
  • 取得値の複数使用

    $result = mysql_query("SELECT id, name FROM mytable"); while ($row = mysql_fetch_array($result, MYSQL_NUM)) { $id = mb_convert_encoding($row['id'] , "SJIS", "EUC"); $name = mb_convert_encoding($row['name'], "SJIS", "EUC"); echo $id.":".$name; } 一度DBより取得した値 $resultの中身を複数回使用したいのですが・・・。 毎回、DBにアクセスしないとダメですか?

    • 締切済み
    • PHP
  • foreachで配列を作る

    $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { $data_list[]=array( $array[0]=>$row["$array[0]"], $array[1]=>$row["$array[1]"], $array[2]=>$row["$array[2]"], $array[3]=>$row["$array[3]"], $array[4]=>$row["$array[4]"], $array[5]=>$row["$array[5]"]); } をforeachを使って $array = array("id","name","address","tel","point","a1"); $res = $db->query($sql);  //sqlのクエリー while ($row = $res->fetchRow( DB_FETCHMODE_ASSOC )) { foreach(~){             //処理     } のようにかきかえたいのですがどうしたらいいでしょうか?foreachをしらべていろろやったのですがうまくいきません。よろしくおねがいします。  ちなみに$data_list[]の配列はArray ( [0] => id [1] => name [2] => address [3] => tel [4] => point [5] => a1 ) Array ( [0] => Array ( [id] => 0 [name] => ここあ [address] => 東京 [tel] => 2 [point] => 2 [a1] => 2 ) [1] => Array ( [id] => 1 [name] => 太郎 [address] => 東京 [tel] => 3 [point] => 5 [a1] => あ ) [2] => Array ( [id] => 4 [name] => 五郎 [address] => 東京 [tel] => 0 [point] => 1 [a1] => あああああ ) [3] => Array ( [id] => 5 [name] => 士郎 [address] => 神奈川 [tel] => 26 [point] => 5 [a1] => ああああああああああ ) …となります。

    • 締切済み
    • PHP
  • phpでデータリスト作成

    php+PostgreSQLでデータのリスト作成をしています。 DB内にあるデータを条件に合うデータを30件ずつ表示させ、ページ切替をしています。 10ページあると、ページ切替のリンクが、 1~10まで全て表示されます。 これを5ページ目まで+次ページ 前ページ 6 7 8 9 10 が表示 どのようにすればよいでしょうか? よろしくお願い致します。 現時点でのソースです。 **************************************************DB接続後 $sql = "select count(*) from entry_user"; $result = pg_query($sql) or die("Failed to execute SQL\n"); $row = pg_fetch_result($result,0,0); $ln = 30; if ($row%$ln == 0){  //表示する件数(MAX) $pn = floor($row / $ln); } else{ $pn = floor($row / $ln)+1;  } pg_free_result($result); $data = "entry_id,entry_time,company,dept,sei,mei,post1,post2,pref,address2,address3,email,entry_flag"; $sort_key = "entry_id"; //ソート対象フィールド $sort ="desc"; //ソート desc:降順 $sql1 = "select $data from entry_user order by $sort_key $sort limit $ln offset " . ($pnn-1)*$ln ; //SELECT文 $result1 = pg_query($sql1) or die("Failed to execute SQL\n"); $row1 = pg_num_rows($result1); for ($i = 0; $i < $row1; $i++){ $table[$i] = pg_fetch_row($result1,$i); } 一覧表示後(省略) //ここからページ切替作成 for ($n = 1;$n<$pn+1;$n++){ if($pn != 1){ if($n != $pnn){ print(" <a href=list01.php?pnn=" . $n . ">"); print($n . "</a> \n"); } else{ // ページ数が、現在表示しているページと同じで有ればリンクなし print($n . " \n"); }} else{ print("1\n"); }}

    • ベストアンサー
    • PHP

専門家に質問してみよう