sql >> Base de Datos >  >> RDS >> Mysql

Edades GROUP y COUNT() en CakePHP

Los resultados que obtiene son prácticamente los mejores que produce CakePHP.

Para simplificar esto, debe usar Set::combine que vuelve a indexar su matriz.

Debería llamar a $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');

Esto devolvería una matriz con la edad como índice y contaría como el valor:

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

        )

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

        )
    ...
)

La razón de la profundidad adicional en la matriz es que cake usa el modelo como la clave para la matriz interna si no está utilizando campos calculados, de modo que puede colocar varios modelos como campos y se dividirán en diferentes matrices. Cuando usa campos calculados, mantiene la misma estructura, pero no conoce el modelo, por lo que debe colocarlo en una matriz general.

Entonces, digamos que también desea agrupar por hombre/mujer y tiene un campo User.sex, que no es un campo calculado.

$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'
));

Esto devolvería (algo así como):

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
                )

        )
)

Por lo tanto, para mantener la coherencia, la profundidad adicional siempre está ahí, incluso si solo usa campos calculados