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

