You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP三级分类系统中统计Mid Category关联商品数的实现方法

数据库结构说明

站点分类共三级:

  • Top Category(顶级分类):站点主菜单展示的5个核心主分类
  • Mid Category(二级分类):选中顶级分类后,下拉菜单展示的关联子分类
  • End Category(三级分类):选中二级分类后,下拉菜单展示的下一级关联子分类

业务场景

站点导航主菜单提供4-5个顶级分类供用户选择,顶级分类下挂载二级分类,部分二级分类还下挂三级子分类。例如Sneakers(运动鞋)顶级分类下有Adidas、Nike、Reebok等10个二级分类,其中Nike二级分类下又有AirMax 180、TN等4个三级分类。

待解决问题

现有代码可查询出数据库中所有二级分类,但无法正确展示每个二级分类关联的商品总数,需要实现:用户浏览Nike这类二级分类时,分类名称下方直接显示该分类关联的所有上架商品总数量。

原有可运行代码

<?php
    $i=0;
    $statement = $pdo->prepare("SELECT
        // 商品信息字段
        t1.p_id,
        t1.p_name,
        t1.p_old_price,
        t1.p_current_price,
        t1.p_qty,
        t1.p_featured_photo,
        t1.p_is_featured,
        t1.p_is_active,
        t1.ecat_id,
        // 三级分类字段(AirMax 180、TN等)
        t2.ecat_id,
        t2.ecat_name,
        // 二级分类字段(Nike、Reebook、Addidas等)
        t3.mcat_id,
        t3.mcat_name,
        // 顶级分类字段(Shoes、Jacket、Socks等)
        t4.tcat_id,
        t4.tcat_name

        FROM tbl_product t1
        JOIN tbl_end_category t2
        ON t1.ecat_id = t2.ecat_id
        JOIN tbl_mid_category t3
        ON t2.mcat_id = t3.mcat_id
        JOIN tbl_top_category t4
        ON t3.tcat_id = t4.tcat_id
        ORDER BY t1.p_id DESC
    ");
    $statement->execute();
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);
    foreach ($result as $row) {
        $i++;
?>
<h6><a href="product-category.php?id=<?php echo $row['mcat_id']; ?>&type=mid-category"><?php echo $row['mcat_name']; ?></a></h6>
<span>
    <?php 
         // 待补充:当前分类关联商品总数
    ?>
</span>
<?php
    }
?>

原有代码缺陷

  • 以商品表为主表关联查询,一个二级分类下有多少件商品,就会重复输出多少次分类入口
  • 未做分组聚合计算,无法直接获取每个二级分类对应的商品总数量
  • 内连接写法会漏掉没有上传商品的二级分类
实现方案

直接替换原有查询+循环代码段即可:

<?php
    $statement = $pdo->prepare("SELECT
        t3.mcat_id,
        t3.mcat_name,
        t4.tcat_id,
        t4.tcat_name,
        COUNT(DISTINCT t1.p_id) as product_total
        FROM tbl_mid_category t3
        JOIN tbl_top_category t4
        ON t3.tcat_id = t4.tcat_id
        LEFT JOIN tbl_end_category t2
        ON t2.mcat_id = t3.mcat_id
        LEFT JOIN tbl_product t1
        ON t1.ecat_id = t2.ecat_id AND t1.p_is_active = 1
        GROUP BY t3.mcat_id
        ORDER BY t3.mcat_id DESC
    ");
    $statement->execute();
    $result = $statement->fetchAll(PDO::FETCH_ASSOC);
    foreach ($result as $row) {
?>
<h6><a href="product-category.php?id=<?php echo $row['mcat_id']; ?>&type=mid-category"><?php echo $row['mcat_name']; ?></a></h6>
<span>
    <?php 
         echo $row['product_total'] . ' 件商品';
    ?>
</span>
<?php
    }
?>

关键逻辑说明

  • 以二级分类表tbl_mid_category为主表查询,保证所有二级分类都能正常展示,不会因为分类下无商品就被过滤
  • 用COUNT(DISTINCT t1.p_id)做去重计数,避免多表关联时商品ID重复导致计数虚高
  • 关联商品表时增加t1.p_is_active = 1条件,仅统计上架状态的商品,需要统计全量商品(含下架)删除该条件即可
  • 按二级分类IDmcat_id分组,从SQL层面解决同一分类重复输出的问题,商品量级大时查询性能远高于原有循环全量商品的写法

内容的提问来源于stack exchange,提问作者Lauren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:25:25