MySQL в то время как запрос цикла внутри другого запроса цикла

<?php include 'config.php'; $conn = mysql_connect("$hostname", "$username", "$password") or die ("Failed to connect to DB."); mysql_select_db("$dbname",$conn); $sql="SELECT * FROM opdrachten"; $result=mysql_query($sql,$conn); while ($row= mysql_fetch_array($result)) { echo $row['name']; echo "<br>"; $opdrachtid = $row["id"]; $sql2="SELECT * FROM resultaten WHERE(opdrachtid='".$opdrachtid."')"; $result2=mysql_query($sql2,$conn); while ($row2= mysql_fetch_array($result2)) { echo " <li> <a href=\"result.php?id=".$row2["id"]."\"> <img src=\"".$row2["img"]." \"width=\"150\" height=\"150\"> <div><span>TEXT HERE</span></div> </a> </li>"; } } ?> 

Я хочу, чтобы мой код выполнял (в цикле):

  1. Выбираем все строки из таблицы «opdrachten» и эхо их «имя».
  2. Возьмите «id» из каждой строки в «opdrachten»> store в переменной $ opdrachtid
  3. Получить строки из таблицы «resultaten», где «opdrachtid == $ opdrachtid» (который я только что сохранил)
  4. Эхо «id» и «img» из строк, полученных из 3.

Что я хочу увидеть на своей странице:

  1. Название «opdrachten» (цель) в таблице «opdrachten» непосредственно под ним
  2. Изображения (URL-адрес которых хранится в таблице «resultaten»), которые назначены этим целям (WHERE opdrachten.id = resultaten.opdrachtid)

Я заглянул в JOIN, так как это ответ на большинство связанных тем, которые я читал здесь, но это, похоже, не то, что я ищу, поскольку я эхо в первом и объявляю переменные которые используются для второго запроса.

Используемые таблицы:

'resultaten' id | Оффшоры | имя

'opdrachten' id | имя

Снова, resultaten.opdrachtid == opdrachten.id

Спасибо заранее, оцените помощь 🙂

Я бы, конечно, предложил использовать JOIN здесь таким образом, чтобы вы могли получить все эти данные за один раз. Однако я добавлю одно предостережение – для этого потребуется больше памяти, которая запрашивает базу данных в цикле, как вы сейчас делаете, поэтому, если у вас есть большое количество строк в любой таблице, это может быть не подходящий подход.

Запрос будет просто:

 SELECT * FROM opdrachen INNER JOIN resultaten ON opdrachen.id = resultaten.opdrachenid 

Затем вы можете настроить массив, который вводится в каждый идентификатор очень просто:

 $array = array(); while ($row = mysql_fetch_array($result)) { $array[$row['id']][] = $row; } 

Это дает вам простой способ повторить результаты, по одному идентификатору в одно и то же время:

 foreach ($array as $id => $rows_for_id) { // output stuff for row group foreach ($rows_for_id as $resultaten_row) { // output stuff for resultaten rows } } 

Несколько других предложений:

  • Не используйте функции mysql_ *, поскольку они устарели. Узнайте, как использовать mysqli или PDO.
  • Не используйте запросы SELECT * . Его ленивая и потерянная полоса пропускания, время передачи и системная память. Только запрос для конкретных полей, на которые вы действительно заинтересованы. Поэтому замените * в моем примере фактическим полем, в котором вы нуждаетесь.
 SELECT opdrachten.*, resultaten.* FROM opdrachten INNER JOIN resultaten ON resultaten.opdrachtid = opdrachten.id; 

просто используйте это как исходный оператор sql и перебирайте его.