Как я могу контролировать время цикла в другой цикл - PullRequest
2 голосов
/ 30 ноября 2009

Предположим, у меня есть цикл 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 выполнялся в соответствии с разрешенным мной числом раз ........ !! как я могу это сделать ......... !!

Ответы [ 5 ]

1 голос
/ 30 ноября 2009

Я не уверен, что на 100% понимаю ваш вопрос - немного неясно.

Возможно, вы могли бы решить эту проблему в запросе с предложением GROUP BY

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

Но это сработает, только если вам нужно просто secondtable.id, а не какие-либо другие столбцы.

Когда вы говорите «количество времени, отведенное мной», вы имеете в виду какое-то произвольное значение? Если это так, то вам нужно использовать другой механизм цикла, например, решение Грега Б.

0 голосов
/ 01 декабря 2009

Я согласен с Леонардо Эррерой, что на самом деле не ясно, что вы пытаетесь спросить здесь. Было бы полезно, если бы вы могли переписать свой вопрос. Это звучит так, будто вы пытаетесь запросить одну таблицу, а не включить идентификаторы, найденные в другой таблице. Вы можете попробовать что-то вроде:

SELECT * FROM secondtable t2
WHERE NOT EXISTS (SELECT 1 FROM tablename t1 WHERE t1.id = t2.id);
0 голосов
/ 30 ноября 2009

Хотите ли вы явно ограничить количество итераций внутреннего цикла?

Рассматривали ли вы использование цикла 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;
    }
}
0 голосов
/ 30 ноября 2009

Ваш первый цикл while повторяет все 5 результатов, по одному за раз.

Ваш второй цикл while выполняет итерацию по каждому из 5 результатов, создавая собственный набор результатов (т. Е. 3 результата для каждой из 5 итераций, всего 15 результатов).

Я считаю, что вы пытаетесь исключить все идентификаторы, найденные в первом цикле, из второго запроса. Вы можете сделать это следующим образом:

$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;
}
0 голосов
/ 30 ноября 2009
$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 в массиве для проверки на следующей итерации, если он уже был запрошен. Я также думаю, что группировка первого результата запроса была бы лучшим способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...