【问题标题】:how can i controll while loop into another while loop我如何控制while循环进入另一个while循环
【发布时间】:2009-11-30 18:28:44
【问题描述】:

假设我有一个像这样的while循环:

$sql = mysql_query("SELECT * FROM tablename");
while($row = mysql_fetch_array($sql)){

  $id = $row["id"];
  $sql_2 = mysql_query("SELECT * FROM secondtable WHERE id != $id ");
  while($ro = mysql_fetch_array($sql_2)){
   $id2 = $ro["id2"];
   echo $id2;
   }

}

如果第一个查询返回 5 个结果,即 1-5,第二个查询返回 3 个结果,而不是我想回显第二个查询,它会给我这样的结果............

111112222233333

我怎样才能修复到 123,以便第二个 while 循环应该根据我允许的次数执行............!!我该怎么做…………!!

【问题讨论】:

  • 嗯???如果您的循环结果是 111112222233333 ,则似乎 secondtable 中的 id 不是唯一的。我什至想知道 111112222233333 是否可能是该特定循环的输出......
  • 我知道他的问题很难理解,但同时许多使用 stackoverflow 的人不会说英语。请在投票前考虑到这一点。
  • cballou:我就是其中之一。在这种情况下,这不是问题。证明两个表的样本数据和预期的输出会有所帮助。看看答案——所有答案都采用“我不明白你想要什么,但这是一个猜测”的形式。

标签: php loops while-loop


【解决方案1】:

我不确定我是否 100% 理解您的问题 - 有点不清楚。

您可以在查询中使用 GROUP BY 子句解决这个问题

$sql_2 = mysql_query("SELECT id FROM secondtable WHERE id != $id GROUP BY id");

但这只有在您需要 secondtable.id 而不需要任何其他列时才有效。

当您说“我允许的时间数”时,您是指某种任意值吗?如果是这样,那么您需要使用不同的循环机制,例如 Greg B 的解决方案。

【讨论】:

    【解决方案2】:

    是否要明确限制内循环的迭代次数?

    您是否考虑过使用 for 循环?

    $sql = mysql_query("SELECT * FROM tablename");
    
    while($row = mysql_fetch_array($sql)){
        $id = $row["id"];
        $sql_2 = mysql_query("SELECT * FROM secondtable WHERE id != $id ");
    
        for($i=0; $i<3; $i++){
           $ro = mysql_fetch_array($sql_2);
           $id2 = $ro["id2"];
           echo $id2;
        }
    }
    

    【讨论】:

    • 它给了我相同的结果,如果给我以下结果,我处于相同的先前位置........ 12131415
    【解决方案3】:

    您的第一个 while 循环遍历所有 5 个结果,一次一个。

    您的第二个 while 循环对 5 个结果中的每一个进行迭代,生成它自己的一组结果(即 5 次迭代中的每一个都有 3 个结果,总共 15 个结果)。

    我相信您要做的是从第二个查询中排除在第一个循环中找到的所有 ID。你可以这样做:

    $sql = mysql_query("SELECT * FROM tablename");
    $exclude = array();
    while($row = mysql_fetch_array($sql)) {
        array_push($exclude, $row['id']);
    }
    
    // simplify query if no results found
    $where = '';
    if (!empty($exclude)) {
        $where = sprintf(' WHERE id NOT IN (%s)', implode(',', $exclude));
    }
    
    $sql = sprintf('SELECT * FROM secondtable%s', $where);
    while($row = mysql_fetch_array($sql_2)) {
       $id2 = $row["id2"];
       echo $id2;
    }
    

    【讨论】:

      【解决方案4】:
      $sql = mysql_query("SELECT * FROM tablename");
      $tmp = array();
      while($row = mysql_fetch_array($sql)){
      
          $id = $row["id"];
          if(!in_array($id, $tmp)) {  
              $sql_2 = mysql_query("SELECT * FROM secondtable WHERE id != $id ");
              while($ro = mysql_fetch_array($sql_2)){
                  $id2 = $ro["id2"];
                  echo $id2;
              }
              $tmp[] = $id;
          }
      }
      

      将所有查询的 $id 保存在一个数组中,以检查下一次迭代是否已被查询。我也认为对第一个查询结果进行 GROUP 会是一种更好的方法。

      【讨论】:

        【解决方案5】:

        我同意 Leonardo Herrera 的观点,即目前还不清楚您想在这里问什么。如果您可以重写您的问题,这将有所帮助。这听起来有点像您试图查询一个表而不包括在另一个表中找到的 id。您可以尝试以下方法:

        SELECT * FROM secondtable t2
        WHERE NOT EXISTS (SELECT 1 FROM tablename t1 WHERE t1.id = t2.id);
        

        【讨论】:

          猜你喜欢
          • 2022-10-12
          • 1970-01-01
          • 2016-01-11
          • 2012-01-18
          • 2015-01-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-08
          相关资源
          最近更新 更多