CakePHP中的GROUP和COUNT()年龄

met*_*ras 5 mysql cakephp

我正在尝试按出生日期进行分组,并根据结果计算,使用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的博客中找到.)

dei*_*zel 2

我认为您在结果数组上获得了数字索引,因为您添加的字段尚未由 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)

也许这会让你更幸运地获得工作条件。:)

  • 我建议尝试 CakePHP 1.3 中新的“虚拟字段”功能。虽然代码处于“测试版”状态,但 1.2 中的所有测试仍然通过:http://cakephp.lighthouseapp.com/projects/42648/13- new-features-virtual-fields(升级说明:http://cakephp.lighthouseapp.com/projects/42648/13-migration-guide) (2认同)