2013-01-15 225 views
0

我有一套嵌套的while循环来比较mysql对彼此的查询。下面是代码:嵌套while循环mysql_fetch_array

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元素的类草拟。

在此先感谢。

+0

[**请不要在新代码中使用'mysql_ *'函数**](http://bit.ly/phpmsql)。他们不再被维护[并被正式弃用](https://wiki.php.net/rfc/mysql_deprecation)。看到[**红框**](http://j.mp/Te9zIL)?学习[*准备的语句*](http://j.mp/T9hLWi),并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [这篇文章](http://j.mp/QEx8IB)将帮助你决定哪个。如果你选择PDO,[这里是一个很好的教程](http://j.mp/PoWehJ)。 – Kermit

回答

0

我认为你要么需要:

  • 打开光标$crossedAnswer每一行从$resultbat(在通过每个循环的开始打开它,并在年底从而有效地将其关闭,运行在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 。


来处理此ResultSet,在原有基础上的代码可以是这样的代码:

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'] . "'>"; 
    ... 
} 
+0

我将如何将所有行从$ crossedAnswer中获取到结构中?你能举一个这样的例子吗? – rodzilla

+0

我理解做加入的概念,但我需要从$ resultbat中打印所有玩家,并只更改$ crossedAnswer结果中特定玩家的课程。如果我加入,只给我两个表中的球员,那么我将无法打印出所有球员。 – rodzilla

+0

@ user1956847:一个OUTER JOIN完全符合你的需要,它从一个表(或查询)返回所有行,以及来自另一个表(或查询)的任何“匹配”行(如果有的话)。在你的情况下,结果集需要包含一个表示是否在两个表中都找到玩家的列。通常,运行一个查询来获得所需的结果集比运行两个(或更多)查询和滚动自己的外部联接操作更有效。 – spencer7593