PHP + MySQL 导航 : How to load 2 levels in 1 query?

标签 php mysql sql

我的导航有问题。 我有 2 级导航:

  1. super 类别
  2. 类别

我的 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

此代码加载页面的时间太长。我需要在 1 个查询中添加所有这些代码。我怎样才能做到这一点?

最佳答案

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

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

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

关于PHP + MySQL 导航 : How to load 2 levels in 1 query?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20121778/

相关文章:

php - Laravel 4.2 过滤访问上传文件

php - 使用 MySQL 的 Android 登录页面

php - Mysql根据某列的SUM返回结果

php - 向数据库记录发送电子邮件时出现 Codeigniter 错误

mysql - 如何使用 mysql 子查询减去库存和销售额?

sql - 如何在 SQL 中计算点积

php - 将内容加载到应用程序的最佳方式

php - 无法摆脱后续请求的下载文件对话框

php - 使用 $_GET 变量进行记录集查询

mysql - 如何在 MySQL 中进行算术运算