我正在尝试按出生日期进行分组,并根据结果计算,使用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'
));
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.该字段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
)
)
Run Code Online (Sandbox Code Playgroud)
当然必须有更好的方法.
我甚至无法过滤它.此代码抛出错误.未知列'年龄'
$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'
));
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这些是查询.
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
Run Code Online (Sandbox Code Playgroud)
(年龄计算程序在matt的博客中找到.)
我认为您在结果数组上获得了数字索引,因为您添加的字段尚未由 CakePHP 生成。CakePHP 通常在 SQL 中生成更像这样的查询(和字段名称):
SELECT `Item`.`id`, `Item`.`name` FROM `items` AS `Item` WHERE 1 = 1 ORDER BY `Item`.`name` ASC
Run Code Online (Sandbox Code Playgroud)
如果您希望 CakePHP 更好地理解和格式化从 MySQL 返回的结果,则在向查询添加自定义元素时,您应该尝试模仿 CakePHP 的字段命名约定:
$age = "DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(User.dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(User.dob, '00-%m-%d'))";
$data = $this->User->find('all', array(
'conditions' => array('User.age >' => 20),
'fields' => array(
$age . ' AS `User`.`age`',
'COUNT(id) AS `User`.`count`'
),
'group' => 'User.age'
));
Run Code Online (Sandbox Code Playgroud)
也许这会让你更幸运地获得工作条件。:)
归档时间: |
|
查看次数: |
15003 次 |
最近记录: |