php - 从嵌套集中获取所有子类别并连接产品表

标签 php mysql database join nested-lists

我想检索具有给定父类别的所有子类别,并且我想将我的产品表加入到该结果中。结果应该是一个面包屑导航,用户可以单击父类别并检索该类别中的所有产品以及子类别。

面包屑看起来像这样:Electronic >> Music >> MP3-Player >> Flash 如果用户点击“音乐”,结果应包含“音乐”、“MP3 播放器”和“Flash”类别中的所有产品。

我使用嵌套集,但我发现用复杂的查询来处理它真的很困难。

我的数据库看起来像这样:

category_table:ID/名称/lft/rgt products_table:ID/标题/描述/图片/category_id/...

我的查询现在看起来像这样:

    $result=mysql_query('SELECT *, node.id, node.name
FROM category AS node,
        category AS parent,
        category AS sub_parent,
        (
                SELECT node.name
                FROM category AS node,
                category AS parent
                WHERE node.lft BETWEEN parent.lft AND parent.rgt
                AND node.id = 23
                GROUP BY node.name
                ORDER BY node.lft
        )AS sub_tree JOIN products ON products.id = id
WHERE node.lft BETWEEN parent.lft AND parent.rgt
        AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
        AND sub_parent.name = sub_tree.name
GROUP BY node.name
ORDER BY node.lft;') or die(mysql_error());

但这给了我错误“#1104 - SELECT 将检查超过 MAX_JOIN_SIZE 行;检查 WHERE 并使用 SET SQL_BIG_SELECTS=1 或 SET MAX_JOIN_SIZE=# 如果 SELECT 没问题”。我不明白。

最佳答案

尝试这个 PHP 脚本。它可能有一些语法错误,我还没有测试它,但它应该完全符合你的要求。

需要注意的是,您需要在 categories 表中添加一个名为 category_parent_id 的字段,并将其默认值设置为 0null

class breadcrumbNav
{
    private $dataArray = array();
    private $breadcrumb = array();

    public function __construct()
    {
        $this->getAllRecords();
        return;
    }


    private function getAllRecords()
    {
        $result = $db->prepare("
            SELECT p.ID as product_id, p.title AS product_title, p.description AS product_description, p.pic AS product_picture, 
                   c.ID as category_id, c.Name as category_name, c.lft AS category_lft, c.rgt AS category_rgt, c.parent_id AS category_parent_id 
            FROM products p 
            LEFT JOIN categories c 
                 ON p.category_id = c.ID 
        ");

        $result->execute();

        $this->dataArray = $result->fetchAll(PDO::FETCH_ASSOC);
        return;
    }

    function buildBreadcrumb($recordId, $firstRun = true)
    {
         foreach($this->dataArray as $row)
         {
             if(($row['product_id']==$recordId && $firstRun) || ($row['category_id']==$recordId && $firstRun===false))
             {
                  $this->breadcrumb[] = '<a href="?categoryId=' . $row['category_id'] . '">' . $row['category_name'] . '</a>';

                  if($row['category_parent_id']!==0 && !is_null($row['category_parent_id']))
                  {
                      $this->buildBreadcrumb($this->buildBreadcrumb($row['category_parent_id'], false));
                  }
             }
         }

         return implode(' &gt;&gt; ', $this->breadcrumb;
    }
}



$currentProductId = 'ENTER THE PRODUCT ID HERE';
$breadcrumbObject = new breadcrumbNav();
$breadcrumb = $breadcrumbObject->buildBreadcrumb($currentProductId);

关于php - 从嵌套集中获取所有子类别并连接产品表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16872819/

相关文章:

mysql - 当第一列不为空时填写下一列php Mysql

php - 高效设计和管理用户设置模块

database - "COMPRESS FOR ALL OPERATIONS"和 "COMPRESS FOR OLTP"之间的区别?

php - 如何生成 eBay OAuth 用户 token ?

php - Symfony2 - 未找到类

php - PHP 中的命令相当于 javascript 中的警报

添加外键约束时的 MySQL 语法错误

MySQL 在带有逗号分隔列表的列上搜索多个值

php - 如何获得没有运输等级的产品

PHP/MySQL 好友请求系统