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

CodeIgniter查询:筛选仅购买单一品类产品的客户

数据表结构

customers表

idnameemail
1richaricha@gmail.com
2samsam@gmail.com
3hellahella@gmail.com

orders表

idcustomer_id
1011
1022
1033

order_product表

idorder_idproduct_id
1011
1021
1032

products表

idproduct_name
1Mobile
2AC
3Fridge
需求说明

筛选出仅购买一种类型产品的客户(可多次购买同一品类,但从未购买其他品类产品)。

原代码问题分析
  1. 语法错误:->where('order_products.product_id', > 0); 写法完全错误,CodeIgniter的where方法不支持这种参数格式,且该条件无实际意义(所有product_id都是正整数)。
  2. 表名不一致:原代码中用了order_products,但实际表名是order_product,会导致关联失败。
  3. 核心逻辑缺失:仅按客户ID分组,但没有统计每个客户购买的产品品类数量,完全没实现“仅购买一种类型”的筛选逻辑。
  4. 未执行查询:代码最后直接返回查询构建器对象,没有调用get()方法执行查询并获取结果集。
正确实现思路
  1. 关联customers、orders、order_product三张表,确保表名正确。
  2. 按客户ID分组,同时统计每个客户对应的唯一产品ID的数量(用COUNT(DISTINCT product_id))。
  3. 筛选出唯一产品数量等于1的客户。
  4. 执行查询并返回结果数组。
正确CodeIgniter代码实现
// 构建查询
$query = $this->db->table('customers')
    ->join('orders', 'orders.customer_id = customers.id')
    ->join('order_product', 'order_product.order_id = orders.id') // 修正表名
    ->select('customers.id, customers.name, customers.email, COUNT(DISTINCT order_product.product_id) as product_type_count')
    ->groupBy('customers.id')
    ->having('product_type_count', 1); // 筛选仅购买一种品类的客户

// 执行查询并获取结果数组
$resultArr = $query->get()->result_array();

return $resultArr;
代码说明
  • COUNT(DISTINCT order_product.product_id):统计每个客户购买的不同产品品类数量,去重后计数,确保多次购买同一品类只算1种。
  • having('product_type_count', 1):分组后筛选出品类数量为1的客户,这是实现需求的核心条件。
  • get()->result_array():执行查询并将结果转为数组返回,替代原代码直接返回构建器对象的错误写法。

内容的提问来源于stack exchange,提问作者Goldy-566

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:55:17