Mysql CakePHP-查找并计算存在多少相关记录
我正在尝试执行一个搜索,作为一个条件,它必须只返回具有一定数量关联记录的记录 目前我有一个模型(乐队)和一个关联模型thourgh hasmany(SongID)。每个乐队可以有许多歌曲ID 在这个特定的搜索中,我想返回4个乐队的结果,其中这些乐队至少有10个相关的歌曲ID 我尝试在find过程中使用“HAVING”条件执行此操作,在songid模型中使用“COUNT(songid.band_id)”的virtualfields执行此操作,但它只返回总数,而不仅仅是所选字段的总数 我怎样才能做到这一点?我在想这样的事情:Mysql CakePHP-查找并计算存在多少相关记录,mysql,cakephp,Mysql,Cakephp,我正在尝试执行一个搜索,作为一个条件,它必须只返回具有一定数量关联记录的记录 目前我有一个模型(乐队)和一个关联模型thourgh hasmany(SongID)。每个乐队可以有许多歌曲ID 在这个特定的搜索中,我想返回4个乐队的结果,其中这些乐队至少有10个相关的歌曲ID 我尝试在find过程中使用“HAVING”条件执行此操作,在songid模型中使用“COUNT(songid.band_id)”的virtualfields执行此操作,但它只返回总数,而不仅仅是所选字段的总数 我怎样才能做到
$random = $this->Band->find('all', array(
'fields' => array('Band.band'),
'order' => 'rand()',
'limit' => 4,
'contain' => array(
'Songid' => array(
'conditions' => array(
'band_id COUNT' => 2)
)
)
)
);
最后一部分“'band_id COUNT'=>2”应该可以实现,但我无法实现有什么想法吗?
编辑:我可以先做一个“全部查找”,然后再做一个foreach,每个关联模型都有一个计数,但我正在寻找一个“一次查找,无需处理”的解决方案。
'band\u id count'=>2
是CakePHP ORM无法理解的,如果你必须使用一个合适的SQL代码段,比如count(table)>=x
但是,条件
总是映射到WHERE
,而WHERE COUNT
在MySQL中不起作用(您可能知道,正如您提到的使用have
)
安威
计数器缓存
在这种特殊情况下,您可以使用字段
通过这种方式,您可以使用以下简单条件轻松查询关联记录的数量:
$this->Band->find('all', array(
// ...
'conditions' => array(
'Band.songid_count >=' 10
)
));
使用连接
如果不使用计数器,则必须手动加入关联的表,因为它们不是自动包含的,而是在单独的查询中使用的
$this->Band->find('all', array(
'joins' => array(
array(
'table' => 'songids',
'alias' => 'Songid',
'type' => 'LEFT',
'conditions' => array('Band.id = Songid.band_id')
)
),
// ...
'group' => 'Band.id HAVING COUNT(Songid.id) >= 10'
));
'band\u id COUNT'=>2
是CakePHP ORM无法理解的,如果您必须使用适当的SQL代码段,如COUNT(table)>=x
但是,条件
总是映射到WHERE
,而WHERE COUNT
在MySQL中不起作用(您可能知道,正如您提到的使用have
)
安威
计数器缓存
在这种特殊情况下,您可以使用字段
通过这种方式,您可以使用以下简单条件轻松查询关联记录的数量:
$this->Band->find('all', array(
// ...
'conditions' => array(
'Band.songid_count >=' 10
)
));
使用连接
如果不使用计数器,则必须手动加入关联的表,因为它们不是自动包含的,而是在单独的查询中使用的
$this->Band->find('all', array(
'joins' => array(
array(
'table' => 'songids',
'alias' => 'Songid',
'type' => 'LEFT',
'conditions' => array('Band.id = Songid.band_id')
)
),
// ...
'group' => 'Band.id HAVING COUNT(Songid.id) >= 10'
));
如果我选择添加countercache选项,即使我删除了相关模型的单个记录,这个数字也会自动更新?例如,有时我必须通过$this->Band->songid->delete删除songid数据库的一些记录。这会更新缓存吗?顺便说一句,我只是好奇地问,我去了手动连接解决方案,它工作得非常完美。谢谢!嗯,它在本地非常有效。当我上传到制作服务器(乐队有10万条记录,SongID有10万条记录)时,我崩溃了网站。我想我要试试countercache解决方案@安德烈斯:是的,这正是计数器缓存的作用。10K/100K不会使服务器崩溃,但可能会有点慢,因为它需要处理所有行以进行计数和随机排序。使用正确索引的计数器缓存应该会更快(假设有10首以上歌曲的乐团少于10K),因为它会在订购前减少曲目集,当然也不再需要计数。如果我选择添加计数器缓存选项,即使我删除了相关模型的单个记录,该编号也将自动更新?例如,有时我必须通过$this->Band->songid->delete删除songid数据库的一些记录。这会更新缓存吗?顺便说一句,我只是好奇地问,我去了手动连接解决方案,它工作得非常完美。谢谢!嗯,它在本地非常有效。当我上传到制作服务器(乐队有10万条记录,SongID有10万条记录)时,我崩溃了网站。我想我要试试countercache解决方案@安德烈斯:是的,这正是计数器缓存的作用。10K/100K不会使服务器崩溃,但可能会有点慢,因为它需要处理所有行以进行计数和随机排序。使用正确索引的计数器缓存应该更快(假设包含10首以上歌曲的频带少于10K),因为它会在订购之前减少集合,当然也不需要再计数。