CakePHP如何实现按数值区间分组统计数据
价格区间分组统计实现方案
你当前的写法存在两个核心错误:
- 将CASE表达式写在了WHERE子句中:WHERE仅用于数据过滤,无法返回价格区间标识供后续分组使用
group(['then'])为无效配置:你没有在查询字段中定义别名为then的字段,自然无法按该字段分组
正确代码
$this->find() ->select([ 'count' => $this->find()->func()->count('*'), // 把CASE表达式放到SELECT中定义为区间字段 'price_range' => function ($exp, $q) { return $exp->addCase( [ $q->newExpr()->lt('price', 500), $q->newExpr()->between('price', 501, 1000), $q->newExpr()->between('price', 1001, 2000), $q->newExpr()->gte('price', 2001), ], ['0-500', '501-1000', '1001-2000', '2001>'], // 指定返回值类型为字符串,避免类型转换异常 ['string', 'string', 'string', 'string'] ); } ]) ->where(['Products.product_category_id' => 3]) // 按自定义的价格区间字段分组 ->group(['price_range']) // 可选:添加排序保证区间顺序和预期一致(MySQL环境可用) ->orderBy([ "FIELD(price_range, '0-500', '501-1000', '1001-2000', '2001>')" => 'ASC' ]);
效果说明
执行查询后遍历结果即可得到你需要的输出格式:
foreach ($results as $item) { echo "{$item->price_range}\t{$item->count}" . PHP_EOL; }
内容的提问来源于stack exchange,提问作者Abu Sayed
相关产品推荐
相关产品推荐

