如何调整SQL多表关联查询,获取分组结构化结果用于层级下拉菜单
实现需求的两种可行方案
方案1:业务代码层面处理(优先推荐)
该方案无需修改现有SQL,逻辑灵活兼容性强,后续调整层级规则也更方便,操作步骤如下:
- 保留你现有的SQL查询逻辑不变,获取全量关联结果集
- 先对结果集按品牌、车型ID排序,保证同品牌、同车型的结果连续排列
- 遍历结果集时,缓存上一条记录的品牌、车型值:
- 当前条的品牌与上一条相同时,将当前条的品牌字段设为Null/空值
- 当前条的车型与上一条相同时,将当前条的车型字段设为Null/空值
- 每次遍历结束后更新缓存的上一条值为当前记录的值
- 处理完成的结果就和你的预期输出一致,可直接用来渲染层级下拉列表
方案2:SQL层面直接修改(仅支持支持窗口函数的数据库,如MySQL 8.0+、PostgreSQL等)
可以通过窗口函数LAG获取上一行记录的字段值,对比后将重复值设为Null,参考语句如下:
WITH full_car_data AS ( SELECT CI.brand_name, CM.car_model_id, CM.model_name, CC.color_name -- 可按需补充其他需要查询的字段 FROM Car_Info AS CI INNER JOIN Car_Model AS CM ON CM.car_id = CI.car_id INNER JOIN Car_Color AS CC ON CC.car_model_id = CM.car_model_id ORDER BY CI.brand_name, CM.car_model_id ) SELECT -- 品牌和上一行重复则返回Null IF(LAG(brand_name) OVER(ORDER BY brand_name, car_model_id) = brand_name, NULL, brand_name) AS brand_name, -- 车型和上一行同品牌下的重复则返回Null IF(LAG(model_name) OVER(PARTITION BY brand_name ORDER BY car_model_id) = model_name, NULL, model_name) AS model_name, color_name FROM full_car_data;
注意:该方案要求窗口函数的排序逻辑和结果集的排序逻辑完全一致,否则会出现字段值错乱的问题。
层级下拉渲染提示
拿到处理后的结果后,既可以直接按字段是否为空来输出对应缩进的下拉选项,也可以先将结果组装为树形结构再渲染:
- 第一层为品牌节点,子节点为该品牌下的所有车型
- 第二层为车型节点,子节点为该车型下的所有颜色
- 渲染时用空格或CSS缩进区分层级即可
内容的提问来源于stack exchange,提问作者Vikas kalal
相关产品推荐
相关产品推荐

