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

CodeIgniter多表关联查询:统计各产品销售总量问题求助

问题排查与解决方案

原代码的核心问题

  • JOIN用法错误:join方法的第二个参数应为表关联条件,而非聚合函数定义,这会直接导致SQL语法错误
  • 聚合函数位置错误:SUM()统计逻辑应放在select语句中,而非JOIN条件里
  • 缺少分组语句:使用聚合函数统计维度数据时,必须通过GROUP BY按产品ID分组,否则会返回全局总和而非单产品统计
  • SQL注入风险:直接拼接$this->session->register_id到WHERE条件中,未做参数转义,存在安全隐患
  • 关联类型错误:未使用左连接(LEFT JOIN),会丢失无销售记录的产品数据

修正后的CodeIgniter代码

public function getProductsListing()
{
    // 选择产品基础字段 + 销售总量统计
    $this->db->select("products.id, products.code, products.name, SUM(COALESCE(sale_items.quantity, 0)) as total_sales");
    $this->db->from('products');
    
    // 左连接销售表,保证无销售记录的产品也能被查询到
    $this->db->join('sale_items', 'sale_items.product_id = products.id', 'left');
    
    // 安全传递参数,自动转义避免SQL注入
    $this->db->where('sale_items.registers_id', $this->session->register_id);
    
    // 按产品ID分组,确保统计每个产品的独立销售总量
    $this->db->group_by('products.id');
    
    $query = $this->db->get();
    
    // 直接返回结果数组,简化逻辑
    return $query->num_rows() > 0 ? $query->result() : [];
}

关键修正说明

  • LEFT JOIN:确保所有产品都出现在结果集中,无销售记录的产品total_sales会被COALESCE处理为0
  • COALESCE函数:处理sale_items.quantity为NULL的场景(即该产品无销售记录时),将NULL替换为0,避免统计结果为NULL
  • 参数绑定:通过CodeIgniter的where参数绑定机制,自动对$this->session->register_id进行转义,彻底规避SQL注入风险
  • GROUP BY分组:按产品ID分组后,SUM()会针对每个产品的销售记录单独求和,得到单产品的销售总量
  • 简化返回逻辑:移除冗余的foreach循环和调试用的var_dump,直接通过三元表达式返回结果数组或空数组,代码更简洁高效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:10:06