使用MYSQL返回的双循环

时间:2012-01-08 13:40:22

标签: php mysql

MySQL在php中循环两次:

$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的列表...

我在这里做错了什么?

8 个答案:

答案 0 :(得分: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 :(得分:2)

您甚至可以使用简单的交叉连接

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

答案 2 :(得分: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";
  }
}

答案 3 :(得分:1)

编写一个执行工作的SQL语句...这比执行2个循环更快;允许数据库执行所有繁重的工作,您只需处理结果!

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

答案 4 :(得分: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'];
}

答案 5 :(得分:1)

你做的事没有意义。 mysql_fetch_*函数通过结果集逐个前进。在你的代码中,外部循环对第一行执行一次,然后内部循环执行,直到你没有行为止。

您应该在SQL中进行交叉连接:

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

答案 6 :(得分:0)

问题非常简单:

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

此while语句从结果对象$ geta中获取第一行。和

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

此循环从结果对象$ geta

中提取剩余的行

然后在第二次循环之后,当它返回到第一个循环时,所有行都已经被取出,因此循环中的条件失败(因为没有更多的行要获取),因此循环退出。实际上你得到了id列表。

答案 7 :(得分: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";
    }
}