2012-01-08 60 views
0

MySQL的雙while循環在PHP中:雙循環和MYSQL返回

$geta=mysql_query("SELECT id FROM table1 WHERE id<50"); 
while($row=mysql_fetch_array($geta)){ 
while($row2=mysql_fetch_array($geta)){ 
$id1=$row['id']; 
$id2=$row2['id']; 
echo "$id1 and $id2"; 
} 
} 

我試圖讓ID的每一個可能的組合與另一個ID。

不知道什麼是錯的......輸出僅僅是一個ID1的列表...

我在做什麼錯在這裏?

回答

3

每次調用mysql_fetch_array()的時候,你從獲取相同的結果從MySQL數據庫設置下一個結果。因此,在外部和內部循環中調用它兩次只會提高記錄指針。

在你的情況,你應該首先加載所有結果到一個數組,然後遍歷是:

// Array to hold all results 
$results = array(); 
$geta = mysql_query("SELECT id FROM table1 WHERE id<50"); 
while($row = mysql_fetch_array($geta)){ 
    // Append all rows to the array 
    $results[] = $row; 
} 

// Now iterate over your array $results in the outer & inner loops 
foreach ($results as $r1) { 
    foreach ($results as $r2) { 
    echo "$r1 and $r2"; 
    } 
} 
1
$geta = mysql_query("SELECT id FROM table1 WHERE id<50"); 
while($row = mysql_fetch_assoc($geta)) { 
    $all_ids = $row['id']; 
} 

foreach ($all_ids as $id_a) { 
    foreach ($all_ids as $id_b) { 
    echo "$id_a and $id_b", "<br>\n"; 
    } 
} 
2

你甚至可以使用一個簡單的交叉聯接

select t1.id,t2.id 
from table as t1 
cross join table as t2 on t1.id <= 50 and t2.id <= 50 
1

寫一個SQL語句這樣做的工作......這將比做2個循環更快;允許數據庫完成所有繁重的工作,而且您只需處理結果!

SELECT A.id, B.ID 
FROM table1 A 
cross join table1 B 
WHERE A.id<50 
1

你應該做的是這樣的:

$geta=mysql_query("SELECT id FROM table1 WHERE id<50"); 
$getb=mysql_query("SELECT id FROM table1 WHERE id<50"); 
    while($row=mysql_fetch_array($geta)){ 
    while($row2=mysql_fetch_array($getb)){ 
     $id1=$row['id']; 
     $id2=$row2['id']; 
     echo "$id1 and $id2"; 
    } 
    } 

,或者使用交叉連接

$getab=mysql_query("SELECT a.id as aid, b.id as bid FROM table1 a CROSS JOIN table1 b ON a.id = b.id WHERE a.id<50 AND b.id < 50"); 
while($row=mysql_fetch_array($getab)){ 
    echo $row['aid'] . ' and ' . $row['bid']; 
} 
+0

我想這一點,但它仍然只運行一次...不知道爲什麼... – David19801 2012-01-08 13:53:01

0

的問題是非常直截了當:

while($row=mysql_fetch_array($geta)){ 

這while語句從res獲取第一行ult對象$ geta。和

while($row2=mysql_fetch_array($geta)){ 

這個循環第二個循環後從結果對象$木屐

剩餘行然後finaly時,它可以追溯到第一循環中,所有的行已經被取出,因此條件循環失敗(因爲沒有更多的行要讀取),因此循環退出。實際上你會得到ID列表。

0

mysql_fetch_array增加相同結果集$ geta的內部查找指針。所以它不工作。如果您只是複製$ geta變量並使用它,它將起作用。

$geta=mysql_query("SELECT id FROM table1 WHERE id<50"); 
$geta2=$geta; 
while($row=mysql_fetch_array($geta)) 
{ 
    while($row2=mysql_fetch_array($geta2)) 
    { 
     $id1=$row['id']; 
     $id2=$row2['id']; 
     echo "$id1 and $id2"; 
    } 
} 
1

你在做什麼都沒有意義。函數通過結果集逐個推進。在你的代碼中,外層循環在第一行執行一次,然後執行內層循環,直到你不在行內。

你應該做在SQL中的交叉連接,而不是:

SELECT t1a.id AS id1, t1b.id AS id2 FROM table1 t1a, table1 t1b WHERE t1a.id<50 AND t1b.id<50