0

互いにmysqlクエリを比較するためのネストされたwhileループのセットがあります。コードは次のとおりです。

while($row = mysql_fetch_array($resultbat))
{
    $drafted = 0;

while($crossedRow = mysql_fetch_array($crossedAnswer))
{

    if($row['NAME'] == $crossedRow['name'])
    {
        $drafted = 1;
    }
    else
    {
        $drafted = 0;
    }
}
if ($drafted == 1)
{
    echo "<tr class='drafted' id='" . $row['NAME'] . "'>";
}
else if($n&1)
{
    echo "<tr id='" . $row['NAME'] . "'>";
}else
{
    echo "<tr class='alt' id='" . $row['NAME'] . "'>";
}

...}

$ resultbatにはすべてのプレーヤーのリストがあり、$crossedAnswerにはマークする必要のあるいくつかのプレーヤーのリストがあります。各プレーヤーについて、プレーヤーの$crossedAnswerリストに含まれているかどうかを確認したいと思います。もしそうなら、そのhtml要素のクラスをドラフトにマークしたいと思います。

前もって感謝します。

4

1 に答える 1

0

私はあなたがどちらかをする必要があると思います:

  • $crossedAnswerから各行のカーソルを開きます$resultbat(各ループの最初でカーソルを開き、最後でカーソルを閉じます。これにより、各for inのクエリが効果的に実行されますresultbat)、または

  • 結果セットからすべての行を構造体にフェッチし、からの各行$crossedAnswerについてその構造体を調べます$resultbat(データベースに対して同じクエリを複数回実行しないようにするため)、または

  • $resultbatと$crossedAnswerの両方がキー値順に並べられていることを確認し、ループを1つだけ実行します。両方のカーソルを開き、それぞれから行をフェッチしてから、キー値を比較して、どちらの結果セットが「遅れている」か、どちらからフェッチするかを決定します(これはより効率的ですが、記述とテストのコードがより複雑です)。

  • これらの結果セットが同じMySQLサーバーからのものである場合は、これを単一のクエリとして書き直し、MySQLに行を結合する作業を行わせ、単一の結果セットのみを処理します。


個人的には、最後のものを選びます。MySQLに参加させ、単一の結果セットを取得し、単一のループを取得します。

結果セットを取得するためのクエリは、次の形式になります。

SELECT b.*
     , IF(a.name IS NOT NULL,1,0) AS drafted
  FROM (
         query_for_$resultbat
       ) b
  LEFT
  JOIN (
         query_for_$crossedAnswer
       ) a
    ON b.name = a.name

に一致する行が見つかった場合、列は1を返し、そうでない場合は0を返すことに注意してaくださいdrafted


元のコードに基づいてこの結果セットを処理するコードは、次のようになります。

while($row = mysql_fetch_array($result))
{
    $class = "";
    if($row['drafted'] == 1
    {
        $class = "class='drafted' ";
    }
    else if($n&1)
    {
        $class = "";
    }
    else
    {
        $class = "class='alt' ";
    }

    echo "<tr " . $class . " id='" . $row['NAME'] . "'>";
    ...
}
于 2013-01-15T22:35:49.143 に答える