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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:57:04