2013-01-15 221 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