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条件,仅统计上架状态的商品,需要统计全量商品(含下架)删除该条件即可 - 按二级分类ID
mcat_id分组,从SQL层面解决同一分类重复输出的问题,商品量级大时查询性能远高于原有循环全量商品的写法
内容的提问来源于stack exchange,提问作者Lauren
相关产品推荐
相关产品推荐

