0

我有一组嵌套的 while 循环来与 mysql 查询进行比较。这是代码:

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 都按键值排序,并且只执行一个循环;打开两个游标,从每个游标中获取一行,然后比较键值以确定哪个结果集“落后”,以及从哪个结果集获取(这更有效,但编写和测试的代码更复杂),或者

  • 如果这些结果集来自同一个 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

请注意,如果在 中找到匹配行a,则该drafted列将返回 1,否则,它将返回 0。


基于原始代码处理此结果集的代码可能如下所示:

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 回答