查找在CakePHP中出现N次的模型的所有不同字段值

时间:2013-07-14 17:29:57

标签: mysql cakephp group-by cakephp-appmodel

所以我有一个名为FeaturedListing的模型,其字段日期是一个mysql日期字段。将有多个具有相同日期值的FeaturedListings。

我想查找所有包含N个或更多精选列表的日期。我想我必须按日期分组,然后找出哪些组中有N个或更多,并获得分组的值。任何人都可以给我任何指示来实现这一目标。可能需要原始的SQL查询。

编辑:感谢下面的答案,它让我走上了正确的轨道,我终于得到了一个我喜欢的解决方案。这有一些特定于我的应用程序的额外条件,但我认为非常清楚。此代码段会查找今天之后至少包含N个精选列表的所有日期。

$dates = $this->find('list', array(
        'fields' => array('FeaturedListing.date'),
        'conditions' => array('FeaturedListing.date >' => date('Y-m-d') ),
        'group' => array('FeaturedListing.date HAVING COUNT(*) >= $N')
        )
    );

然后我调用array_values()从返回的列表中删除索引并将其展平为日期字符串数组。

$dates = array_values($dates);

2 个答案:

答案 0 :(得分:1)

在“原始”SQL中,您将使用group byhaving

select `date`
from FeaturedListings fl
group by `date`
having count(*) >= N;

如果您想要这些日期的商家信息,则需要将其加入原始数据。这是一种方法:

select fl.*
from FeaturedListings fl join
     (select `date`
      from FeaturedListings fl
      group by `date`
      having count(*) >= N
     ) fld
     on fl.`date` = fld.`date`

答案 1 :(得分:1)

无需转到原始SQL,您可以轻松实现这一点($n是包含N的变量):

$featuredListings = $this->FeaturedListing->find('all', array(
   'fields' => array('FeaturedListing.date'),
   'group' => array('FeaturedListing.date HAVING COUNT(*)' => $n),
));