PHP+MySQL导航:如何在一个查询中加载两个级别?

PHP+MySQL导航:如何在一个查询中加载两个级别?,php,mysql,sql,Php,Mysql,Sql,我的导航有问题。 我有两个级别的导航: 超类 类别 我对SQL命令有问题。现在我有一些类似的: $laveMenu_query1 = $mysqli->query("SELECT DISTINCT HlavnaKategoria FROM it_navigacia WHERE HlavnaKategoria != 'x' ORDER BY poradie"); while($laveMenu_result1 = mysqli_fetch_array($laveMenu_query1))

我的导航有问题。 我有两个级别的导航:

超类 类别 我对SQL命令有问题。现在我有一些类似的:

$laveMenu_query1 = $mysqli->query("SELECT DISTINCT HlavnaKategoria FROM it_navigacia WHERE HlavnaKategoria != 'x' ORDER BY poradie");

while($laveMenu_result1 =  mysqli_fetch_array($laveMenu_query1)) {
    $lavemenu_navigacia1 = $laveMenu_result1['HlavnaKategoria'];
    echo "<li class=\"sliding-element\"><a><h3>$lavemenu_navigacia1</h3></a>";

    $lavemenu_query2 = $mysqli->query("SELECT DISTINCT Kategoria FROM it_navigacia WHERE HlavnaKategoria = '$lavemenu_navigacia1'");
    echo "<ul>";

    while($lavemenu_result2 = mysqli_fetch_array($lavemenu_query2)) {
        $lavemenu_navigacia2 = $lavemenu_result2['Kategoria'];
        $lavemenu_odkaz2 = $mysqli->query("SELECT * FROM it_navigacia WHERE Kategoria = '$lavemenu_navigacia2' AND HlavnaKategoria = '$lavemenu_navigacia1'");

        while($lavemenu_odkaz2_result = mysqli_fetch_array($lavemenu_odkaz2)) {
            $odkaz2_1 = $lavemenu_odkaz2_result['KategoriaURL'];
            $odkaz2_2 .= $lavemenu_odkaz2_result['Url'].",";
        }

        if($Kategoria==$odkaz2_1) {
            echo "<li class=\"sliding-element\"><a href=\"/$odkaz2_1.html\" class=\"active\">» $lavemenu_navigacia2</a></li>";
        } else {
            echo "<li class=\"sliding-element\"><a href=\"/$odkaz2_1.html\">» $lavemenu_navigacia2</a></li>";
        }

        $odkaz2_1 = "";
        $odkaz2_2 = "";
    }

    echo "</ul>";
    $odkaz_array = "";
    $odkaz = "";
    echo "</li>";
} // level 1

此代码在加载页面时过长。我需要在一个查询中添加所有这些代码。如何实现这一点?

如果代码加载时间过长,那么我认为您应该查看每个查询的性能。是的,您可以通过连接将这些查询合并为一个查询,但是如果没有正确的索引,则可能需要花费很长时间。我认为您应该首先使用前面的EXPLAIN语句运行这些查询,以确保表被适当地索引

如果它们的索引正确,那么下面是一个代码示例,不幸的是,这是一个最好的猜测。您应该共享您的表结构以及表与自身的关系。使用sqlfiddle.com加载示例数据并共享最终结果集的外观。我也不明白2级导航如何需要3个连接:

SELECT DISTINCT t1.HlavnaKategoria AS t1HlavnaKategoria, t2Kategoria AS t2.Kategoria , t3.*
FROM it_navigacia AS t1 
JOIN it_navigacia AS t2
  ON t2.HlavnaKategoria = t1.HlavnaKategoria
JOIN it_navigacia AS t3
  ON t3.Kategoria = t2.Kategoria 
    AND t3.HlavnaKategoria = t1.HlavnaKategoria
WHERE t1.HlavnaKategoria != 'x' 
ORDER BY t1.poradie

是的,我有索引表。我在PHPMyAdmin mariaDB中测试了这个查询,并在第1行显示错误:-使用数据和表结构加载sqlfiddle.com