1

1つのデータベースに2つのテーブルがあります。最初のテーブル制限を10でクエリしてから、結果をループします。そして、whileループ内で、最初のクエリのデータをパラメータとして使用して、別のクエリを再度実行しています。スクリプトの例を次に示します。

<?php

    $con = mysql_connect(host,username,password);
    mysql_select_db(game_server);

    //My first query
    $q1 = mysql_query('SELECT * FROM game_characters ORDER BY score DESC LIMIT 10');

    while($character = mysql_fetch_object($q1)){
    //My second query
        $q2 = mysql_query('SELECT * FROM game_board WHERE id="'.$character->id.'"');
        $player = mysql_fetch_object($q2);
    }
?>

したがって、結果が100行の場合、2番目のクエリは100回実行されます。そして、私はそれが良くないことを知っています。どうすればそれを改善できますか。1つのクエリですべてを実行する方法はありますか?パラメータとして2番目のクエリからのデータが使用されるwhileループ内に別のクエリがある場合はどうなりますか?

PS:私はオンラインゲームのランキングシステムをやっています。

4

4 に答える 4

3

JOINを使用する場合は、1つのクエリでそれを行うことができます。

SELECT * FROM game_board AS b 
    LEFT JOIN game_characters AS c ON b.id = c.id 
ORDER BY c.score DESC 
LIMIT 10

ネストされたクエリを使用することもできます

SELECT * FROM game_board AS b WHERE 
  id IN (SELECT id FROM game_characters AS c ORDER BY score DESC LIMIT 10)

すべてのgame_character.idを配列に入れて、使用することもできます

$sql = "SELECT * FROM game_board AS b WHERE b.id IN (" . implode(', ', $game_character_ids) . ")";
于 2012-12-04T12:41:43.247 に答える
1

使ってみませんJOINか?

whileこのように、ループ内にクエリはありません。

$con = mysql_connect(host,username,password);
mysql_select_db(game_server);

//My first query
$q1 = mysql_query('
    SELECT * 
    FROM game_characters gc 
    LEFT JOIN game_board gb ON gc.id = gb.id
    ORDER BY score DESC 
    LIMIT 10
');

while($character = mysql_fetch_object($q1)){
    // do Your stuff here, no other query...

}
于 2012-12-04T12:40:05.213 に答える
1

ここでのより良いアプローチは、連結された文字列str内のすべてのIDを「id1」、「id2」、「id3」、...の形式で収集し、次を使用することです。select * from game_board where id in(str)

于 2012-12-04T12:40:50.617 に答える
-1

次のようなことをした場合はどうでしょうか。

<?php

    $con = mysql_connect(host,username,password);
    mysql_select_db(game_server);

    //My first query
    $q1 = mysql_query('SELECT * FROM game_characters ORDER BY score DESC LIMIT 10');

    while($character = mysql_fetch_object($q1)){
    //My second query
        $characters .= " ' $character->id ' ,"
    }
    $q2 = mysql_query("SELECT * FROM game_board WHERE id in (substr($characters,0,strlen($characters - 2))");
    $player = mysql_fetch_object($q2);
?>
于 2012-12-04T12:41:30.300 に答える