嵌套while循环mysql_fetch_array

时间:2013-01-15 22:22:00

标签: mysql while-loop

我有一组嵌套的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元素的类。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我认为你要么:

  • 打开来自$crossedAnswer的每一行的$resultbat上的光标(在每个循环开始时打开它,并在结尾处关闭它,这有效地为每个循环执行该查询在resultbat)或

  • $crossedAnswer结果集中的所有行提取到结构中,并查看$resultbat中每一行的结构(以避免对数据库多次运行相同的查询) ),或

  • 确保$ resultbat和$ crossedAnswer按键值排序,并且只做一个循环;打开两个游标,从每个游标中获取一行,然后比较键值以确定哪个结果集“落后”,以及从哪个获取(这样更有效,但编写和测试的代码更复杂),或者< / p>

  • 如果这些结果集来自同一个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'] . "'>";
    ...
}