MySQL объединяется вместо «вложенного цикла while» - PullRequest
2 голосов
/ 14 марта 2011

Этот код работает просто отлично, но мне не нравится идея циклов while внутри циклов.

Есть ли другой способ с JOINS, который будет работать более эффективно?

$region_results = mysql_query("SELECT id,region_name FROM regions WHERE page_id='$page_id' ORDER BY position ASC",$con_web) or die (mysql_error());
while($region_rows=mysql_fetch_array($region_results))
{
  $region_id=$region_rows["id"];
  $region_name=$region_rows["region_name"];

  echo "  <li>$region_name\n";
  echo "   <ul>\n";

  $block_results = mysql_query("SELECT id,block_name FROM blocks WHERE region_id='$region_id' ORDER BY position ASC",$con_web) or die (mysql_error());
  while($block_rows=mysql_fetch_array($block_results))
  {
    $block_id=$block_rows["id"];
    $block_name=$block_rows["block_name"];

    echo "    <li>$block_name\n";
    echo "     <ul>\n";

    $object_results = mysql_query("SELECT id,object_name FROM objects WHERE block_id='$block_id' ORDER BY position ASC",$con_web) or die (mysql_error());
    while($object_rows=mysql_fetch_array($object_results))
    {
      $object_id=$object_rows["id"];
      $object_name=$object_rows["object_name"];

      echo "      <li>$object_name</li>\n";
    }

    echo "     </ul>\n";
    echo "    </li>\n";
  }

  echo "   </ul>\n";
  echo "  </li>\n";
}

этот код выдает:

  <li>Left Content
   <ul> 
    <li>Block 1
     <ul> 
      <li>Object 1</li> 
     </ul> 
    </li> 
    <li>Block 2
     <ul> 
      <li>Object 1</li> 
     </ul> 
    </li> 
    <li>Block 3
     <ul> 
      <li>Object 1</li> 
     </ul> 
    </li> 
   </ul> 
  </li> 
  <li>Right Panel
   <ul> 
    <li>Block 1
     <ul> 
      <li>Object 1</li> 
      <li>Object 2</li> 
     </ul> 
    </li> 
   </ul> 
  </li> 

Спасибо.

Ответы [ 3 ]

1 голос
/ 14 марта 2011
SELECT  b.id AS block_id, b.block_name, o.id, o.object_name
FROM    blocks b
JOIN    objects o
ON      o.block_id = b.id
WHERE   b.region_id = '$region_id'
ORDER BY
        b.position, b.id, o.position

Запишите значение block_id и закрывайте / открывайте теги блоков всякий раз, когда они меняются.

0 голосов
/ 14 марта 2011

Не столько вложенные циклы WHILE могут стать проблемой эффективности. Я думаю, что ваша проблема заключается в том, что вы делаете много отдельных вызовов в БД, которые могут быть более эффективными, если бы они были объединены.

Попробуйте объединить свои запросы в один запрос с помощью объединений, а затем переберите строки, определяющие изменение групп.

0 голосов
/ 14 марта 2011

что не так с whiles внутри whiles?если они не гарантируют окончание, и если вы можете избежать их, сделав запрос только один раз, я не вижу никаких проблем.

Возможно, вам следует использовать более высокий уровень API для выполнения этой работы.Это было бы лучше для вашего кода.

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