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
相关产品推荐
相关产品推荐

