会員制php+mysqlに関する質問です。

登録したユーザーの情報はテーブル(User)に記録されています。
テーブル(User)のフィールドは以下の2つです。
()内がフィールド名です。

名前(Name) text
紹介人数(Count) text

ユーザーが友達を紹介するごとに(Count)が1増える仕組みです。
友達紹介ランキングベスト3を作ろうと思っているのですが
以下の記述ではページが表示されるのが大変重いです。
もっと軽く表示させるためにはどのような記述が最適でしょうか?
ご教授頂けると幸いです。


省略

$rs = mysql_query("SELECT Count FROM User order by Count desc limit 0,1");
$count = mysql_fetch_row($rs);

$rs2 = mysql_query("SELECT Count FROM User order by Count desc limit 1,1");
$count2 = mysql_fetch_row($rs2);

$rs3 = 同上 limit 2,1");
$count3 = mysql_fetch_row($rs3);



$name0 = mysql_query("SELECT Name FROM User order by Count desc limit 0,1");
$NAME1 = mysql_fetch_row($name0);

$name1 = mysql_query("SELECT Name FROM User order by Count desc limit 1,1");
$NAME2 = mysql_fetch_row($name1);

$name2 = 同上 limit 2,1");
$NAME3 = mysql_fetch_row($name2);

省略

1位$NAME1[0]<br>
紹介人数:$count[0]人
<hr>
2位$NAME2[0]<br>
紹介人数:$count2[0]人
<hr>
3位$NAME3[0]<br>
紹介人数:$count3[0]人


省略

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2010/02/16 16:28:39
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:horonict No.1

回答回数257ベストアンサー獲得回数51

ポイント40pt

こんな感じでどうでしょう。

SQLの発行は1回だけで済みます。

$rs = mysql_query("SELECT * FROM User order by Count desc limit 0,3");
$ccount = 1;
while ($row = mysql_fetch_array($rs)) {
    echo "{$count}位 {$row['Name']}<br />";
    echo "紹介人数:{$row['Count']人<hr />\n";
    $count++;
}
id:xptree

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

とても参考になりました。

こちらを利用させて頂きました。

ありがとうございました。

2010/02/16 16:27:32

その他の回答1件)

id:horonict No.1

回答回数257ベストアンサー獲得回数51ここでベストアンサー

ポイント40pt

こんな感じでどうでしょう。

SQLの発行は1回だけで済みます。

$rs = mysql_query("SELECT * FROM User order by Count desc limit 0,3");
$ccount = 1;
while ($row = mysql_fetch_array($rs)) {
    echo "{$count}位 {$row['Name']}<br />";
    echo "紹介人数:{$row['Count']人<hr />\n";
    $count++;
}
id:xptree

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

とても参考になりました。

こちらを利用させて頂きました。

ありがとうございました。

2010/02/16 16:27:32
id:SOBA No.2

回答回数65ベストアンサー獲得回数6

ポイント30pt

まずはSELECT文の発行を1回にしてみては?

 $res = mysql_query( "SELECT `Name`,`Count` FROM `User` ORDER BY `Count` DESC LIMIT 0,3" );

 while ( $row = mysql_fetch_assoc ( $res ) ) {

  echo $row['Name'] . "…" . $row['Count'] . "人";

 }

 

以下気になった点を。

 ・テーブル内にデータは何件あるの?

   単純に「SELECTを6回発行してるから重い」のかどうか?

   SQL部分だけの実行時間を測ってみるのはいかがでしょうか

 ・CountカラムはTEXT?

 ・同数の場合の処理は?

id:xptree

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

とても参考になりました。

ありがとうございました。

2010/02/16 16:27:55
  • id:xptree
    追記
    MySQL - 5.0.45
  • id:infograve
    単なる感想なので、こちら。

    SELECT文3回発行している時点でアウト。
    個人的な経験上、全ての計算式をSQL上で行い、結果テーブルを構築した上でPHPに戻すのが一番早い。
  • id:infograve
    見直したら6回だった。
    まずは、何らかの本を読んだほうがいいと思う。
  • id:xptree
    コメントありがとうございました。
    参考にさせて頂きます。

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

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

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

回答リクエストを送信したユーザーはいません