Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何改进我的查询-PHP、MSSQL-两级水平菜单_Php_Sql Server - Fatal编程技术网

如何改进我的查询-PHP、MSSQL-两级水平菜单

如何改进我的查询-PHP、MSSQL-两级水平菜单,php,sql-server,Php,Sql Server,我有一个父/子水平菜单。。。第一个查询查找顶级项,然后第二个查询使用该信息来循环和查询每组子项-此查询花费的时间太长。我怎样才能加快速度 <ul> <?php //query top level navigation $tsqlnav = "SELECT DISTINCT id_division AS id, id_division_slot AS slot, parent FROM [xxx].[dbo].[service_div] WHERE

我有一个父/子水平菜单。。。第一个查询查找顶级项,然后第二个查询使用该信息来循环和查询每组子项-此查询花费的时间太长。我怎样才能加快速度

 <ul>
   <?php 
     //query top level navigation
     $tsqlnav = "SELECT DISTINCT id_division AS id, id_division_slot AS slot, parent FROM [xxx].[dbo].[service_div] WHERE id_service = ? AND content_languages_list LIKE ? AND (parent ='' or parent is NULL) ORDER BY slot;";
     $paramsnav = array($lang_id_service, '%'.$_SESSION['id_language'].'%');
     $optionsnav =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
     $stmtnav = sqlsrv_query($conn, $tsqlnav, $paramsnav, $optionsnav);
     if($stmtnav === false) {die( print_r( sqlsrv_errors(), true ));}
     $row_countnav = sqlsrv_num_rows( $stmtnav );
     if ($row_countnav === false) {echo "Error in retrieving row count."; }
     elseif ($row_countnav > 0) {
       $div='0';
       while( $row = sqlsrv_fetch_array( $stmtnav, SQLSRV_FETCH_ASSOC) ) {
         $parent = $row['parent'];
         $id_div = $row['id'];
         $id_div_slot = $row['slot'];
         echo "<li>".$row['id'];
            echo "<ul>";
             $tsqlnav2 = "SELECT DISTINCT id_module AS id, id_module_slot AS slot, parent FROM [xxx].[dbo].[service] WHERE id_service = ? AND content_languages_list LIKE ? AND id_division = ? ORDER BY slot;";
             $paramsnav2 = array($lang_id_service, '%'.$_SESSION['id_language'].'%', $id_div);
             $optionsnav2 =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
             $stmtnav2 = sqlsrv_query($conn, $tsqlnav2, $paramsnav2, $optionsnav2);
             if( $stmtnav2 === false ) { die( print_r( sqlsrv_errors(), true )); }
             $row_countnav2 = sqlsrv_num_rows( $stmtnav2 );
             if ($row_countnav2 === false) {echo "Error in retrieving row count."; }
             elseif ($row_countnav2 > 0) { 
               while( $row2 = sqlsrv_fetch_array( $stmtnav2, SQLSRV_FETCH_ASSOC) ) {
                 $id_mod = 'm'.$row2['id']; 
                 echo "<li>".$id_mod."</li>";
               }
             }
           echo "</ul>";
         echo "</li>";  
       }
     }
   ?>
 </ul>

    我建议把这个逻辑分成两部分

  • 获取顶级项目并创建所有顶级项目的数组
  • 在顶级项数组上运行循环,并获取每个顶级项的子项 逐项分级

  • 现在,在关闭初始请求之前,您正在发出多个数据库请求。一次应该有一个数据库调用。

    对循环语句进行查询是一种不好的做法,可能需要加入表并按键分组。谢谢,我已尝试重新编写代码。我很难把它弄对,我将发布一个关于我遇到的具体问题的单独问题,但感谢你对总体思路的投入——这非常有帮助,为我指明了正确的方向。