【问题标题】:nested while loop mysql_fetch_array嵌套while循环mysql_fetch_array
【发布时间】:2013-01-15 22:22:00
【问题描述】:

我有一组嵌套的 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 元素的类标记为草稿。

提前致谢。

【问题讨论】:

标签: mysql while-loop


【解决方案1】:

我认为你要么需要:

  • 为$resultbat 中的每一行打开$crossedAnswer 上的游标(在每个循环开始时打开它,并在结束时关闭它,这有效地为resultbat 中的每个for 运行该查询),或

  • 将$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'] . "'>";
    ...
}

【讨论】:

  • 我如何将 $crossedAnswer 中的所有行提取到一个结构中?你能举个例子吗?
  • 我理解加入的概念,但我需要打印 $resultbat 中的所有玩家,并且只需更改 $crossedAnswer 结果中特定玩家的类。如果我进行联接只是给我两个表中的玩家,那么我将无法打印出所有玩家。
  • @user1956847: OUTER JOIN 完全符合您的需要,它返回一个表(或查询)中的所有行,以及另一个表(或询问)。在您的情况下,结果集需要包含一个列,该列指示是否在两个表中都找到了玩家。一般来说,运行一个查询来获得所需的结果集比运行两个(或更多)查询并滚动您自己的外连接操作更有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多