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

CakePHP中按产品名称和日期分组展示最新ID产品信息的问题

问题分析

你的原代码存在几个关键问题:

  • 同时按product_name和added_date分组,这会将两个字段完全相同的记录合并,不符合你“分别针对两个字段去重取最大id”的需求。
  • order子句中的模型名写错了,应该是Products而非Product。
  • 直接分组后返回字段,数据库可能会返回分组内的任意一条记录,而非id最大的那条。
解决方案

根据你的需求,需要先筛选出每个product_name对应id最大的记录,再从这些记录中筛选出每个added_date对应id最大的记录,最终得到符合要求的结果。以下是CakePHP的实现代码:

// 子查询1:获取每个product_name对应的最大id
$subqueryProduct = $this->Products->find()
    ->select(['max_id' => $this->Products->find()->func()->max('id')])
    ->group('product_name');

// 子查询2:在上述结果中,获取每个added_date对应的最大id
$subqueryDate = $this->Products->find()
    ->select(['final_id' => $this->Products->find()->func()->max('id')])
    ->where(['id IN' => $subqueryProduct])
    ->group('added_date');

// 最终查询:获取符合条件的记录
$products = $this->Products->find()
    ->where(['id IN' => $subqueryDate])
    ->order([
        'Products.added_date DESC',
        'Products.id DESC'
    ])
    ->all();

如果你的需求是只要满足两个条件中的任意一个(即要么product_name唯一取最大id,要么added_date唯一取最大id),可以调整为使用UNION合并两个查询结果:

// 查询1:每个product_name取id最大的记录
$queryProduct = $this->Products->find()
    ->select(['id', 'product_name', 'added_date'])
    ->where(['id IN' => $subqueryProduct]);

// 查询2:每个added_date取id最大的记录
$subqueryDateOnly = $this->Products->find()
    ->select(['max_id' => $this->Products->find()->func()->max('id')])
    ->group('added_date');
$queryDate = $this->Products->find()
    ->select(['id', 'product_name', 'added_date'])
    ->where(['id IN' => $subqueryDateOnly]);

// 合并结果并去重
$products = $queryProduct->unionAll($queryDate)->distinct()->all();

内容的提问来源于stack exchange,提问作者Roshan Twanabasu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:10:13