gpt4 book ai didi

mysql - CakePHP 中的 GROUP 和 COUNT() 年龄

转载 作者:可可西里 更新时间:2023-11-01 07:03:06 26 4
gpt4 key购买 nike

我正在尝试使用 CakePHP 按出生日期分组并根据结果进行计数。这是我的查询。

$data = $this->User->find('all', array(
'fields' => array(
"DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(User.dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(User.dob, '00-%m-%d')) AS age",
'COUNT(id)'
),
'group' => 'age'
));

到目前为止,还不错。 User.dob 字段是出生日期,它是一个 DATETIME 字段。

事情是,它返回这样的东西:

Array
(
[0] => Array
(
[0] => Array
(
[age] => 9
[COUNT(id)] => 1
)

)

[1] => Array
(
[0] => Array
(
[age] => 10
[COUNT(id)] => 1
)

)

[2] => Array
(
[0] => Array
(
[age] => 11
[COUNT(id)] => 1
)

)

[3] => Array
(
[0] => Array
(
[age] => 12
[COUNT(id)] => 8
)

)

[4] => Array
(
[0] => Array
(
[age] => 13
[COUNT(id)] => 1
)

)

肯定有更好的方法。

而且我什至不能过滤它。此代码抛出错误。未知列“年龄”

$data = $this->User->find('all', array(
'conditions' => array('age >' => 20),
'fields' => array(
"DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(User.dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(User.dob, '00-%m-%d')) AS age",
'COUNT(id)'
),
'group' => 'age'
));

顺便说一下,这些是查询。

SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(User.dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(User.dob, '00-%m-%d')) AS age, COUNT(id) FROM `users` AS `User` WHERE 1 = 1 GROUP BY age 

(年龄计算例程在matt's blog中找到。)

最佳答案

您获得的结果几乎是 CakePHP 产生的最好结果。

为了简化这个你应该使用Set::combine重新索引您的数组。

您需要调用 $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');

这将返回一个以年龄为索引并以计数为值的数组:

Array
(
[9] => Array
(
[COUNT(id)] => 1

)

[10] => Array
(
[COUNT(id)] => 1

)
...
)

数组中额外深度的原因是,如果你不使用计算字段,cake 使用模型作为内部数组的键,这样你可以将多个模型作为字段放入,它们将被拆分成不同的阵列。当您使用计算字段时,它保持相同的结构,但不知道模型所以必须将它放在一个通用数组中。

假设您也想按男性/女性分组,并且您有一个 User.sex 字段,它不是计算字段。

$data = $this->User->find('all', array(
'fields' => array(
"User.sex"
"DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(User.dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(User.dob, '00-%m-%d')) AS age",
'COUNT(User.id) AS [count]' // n.b. you have to give aliases normally
),
'group' => 'age', 'User.sex'
));

这将返回(类似于):

Array
(
[0] => Array
(
[User] => Array
(
[sex] => Male
)
[0] => Array
(
[age] => 4
[count] => 1
)

)

[1] => Array
(
[User] => Array
(
[sex] => Female
)
[0] => Array
(
[age] => 10
[count] => 1
)

)

[2] => Array
(
[User] => Array
(
[sex] => Male
)
[0] => Array
(
[age] => 10
[count] => 1
)

)
)

因此,为了保持一致性,即使您只使用计算字段,额外的深度也始终存在

关于mysql - CakePHP 中的 GROUP 和 COUNT() 年龄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2141914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com