Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql CakePHP-查找并计算存在多少相关记录_Mysql_Cakephp - Fatal编程技术网

Mysql CakePHP-查找并计算存在多少相关记录

Mysql CakePHP-查找并计算存在多少相关记录,mysql,cakephp,Mysql,Cakephp,我正在尝试执行一个搜索,作为一个条件,它必须只返回具有一定数量关联记录的记录 目前我有一个模型(乐队)和一个关联模型thourgh hasmany(SongID)。每个乐队可以有许多歌曲ID 在这个特定的搜索中,我想返回4个乐队的结果,其中这些乐队至少有10个相关的歌曲ID 我尝试在find过程中使用“HAVING”条件执行此操作,在songid模型中使用“COUNT(songid.band_id)”的virtualfields执行此操作,但它只返回总数,而不仅仅是所选字段的总数 我怎样才能做到

我正在尝试执行一个搜索,作为一个条件,它必须只返回具有一定数量关联记录的记录

目前我有一个模型(乐队)和一个关联模型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),因为它会在订购之前减少集合,当然也不需要再计数。