如何改进我的查询-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>
我建议把这个逻辑分成两部分
- 获取顶级项目并创建所有顶级项目的数组
- 在顶级项数组上运行循环,并获取每个顶级项的子项
逐项分级
现在,在关闭初始请求之前,您正在发出多个数据库请求。一次应该有一个数据库调用。对循环语句进行查询是一种不好的做法,可能需要加入表并按键分组。谢谢,我已尝试重新编写代码。我很难把它弄对,我将发布一个关于我遇到的具体问题的单独问题,但感谢你对总体思路的投入——这非常有帮助,为我指明了正确的方向。