Cakephp 2.x 在同一字段上查找同时具有 DISTINCT 和 COUNT 的查询

Posted

技术标签:

【中文标题】Cakephp 2.x 在同一字段上查找同时具有 DISTINCT 和 COUNT 的查询【英文标题】:Cakephp 2.x find query having DISTINCT and COUNT together on same field 【发布时间】:2016-12-31 21:55:34 【问题描述】:

User 表结构。

+------+-------+
|  id  | data  |
+------+-------+
|  1   |   a   |
+------+-------+
|  1   |   b   |
+------+-------+
|  2   |   c   |
+------+-------+

想要的结果。

+------+-------+
|  id  | count |
+------+-------+
|  1   |   2   |
+------+-------+
|  2   |   1   |
+------+-------+

我以多种方式尝试了 DISTINCT 和 COUNT,但仍然没有得到想要的结果。

我在尝试什么

$this->User->find('all',array(
'conditions'=> array(),
'fields' => array(
'DISTINCT(User.id)',
'COUNT(DISTINCT User.id) as count'
)
)
);

【问题讨论】:

【参考方案1】:

试试 group by 子句

$this->User->find('all',
    array(
        'fields' => array(
            'User.id',
            'COUNT(User.id) as count'
        ),
        'group' => 'User.id'
    )
);

【讨论】:

非常感谢。唯一的问题是,它在另一个数组中给出了计数。我试图将 count 更改为 User.count 但没有运气。【参考方案2】:

除了比尔的answer,要获得count 作为User 字段,您需要将其作为virtualField 获得

$this->User->virtualFields['count'] = 0;

$this->User->find('all', [
    'fields' => array(
        'User.id',
        'COUNT(User.id) as User__count'
    ),
    'group' => 'User.id'
]);

这将是您示例的结果:

########## DEBUG ##########
array(
    (int) 0 => array(
        'User' => array(
            'id' => '1',
            'count' => '2'
        )
    ),
    (int) 1 => array(
        'User' => array(
            'id' => '2',
            'count' => '1'
        )
    )
)
###########################

【讨论】:

以上是关于Cakephp 2.x 在同一字段上查找同时具有 DISTINCT 和 COUNT 的查询的主要内容,如果未能解决你的问题,请参考以下文章

条件和在同一领域Cakephp 2.5

具有两个模型会话的 Cakephp 身份验证组件

错误:活动上的查找必须具有唯一的域

CakePHP 3:修改查找数据

CakePHP 3 中表单字段的加密/解密

CakePHP2 与 CakePHP3 在同一个域上共存