Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

GROUP e COUNT() idades no CakePHP


Os resultados que você obtém são praticamente os melhores que o CakePHP produz.

Para simplificar isso, você deve usar Set::combine que reindexa sua matriz.

Você precisaria chamar $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');

Isso retornaria uma matriz com idade como o índice e contaria como o valor:
Array
(
    [9] => Array
        (
            [COUNT(id)] => 1

        )

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

        )
    ...
)

A razão para a profundidade extra na matriz é que o cake usa o modelo como a chave para a matriz interna se você não estiver usando campos calculados, para que você possa colocar vários modelos como campos e eles serão divididos em matrizes diferentes. Quando você usa campos calculados ele mantém a mesma estrutura, mas não conhece o modelo então tem que colocá-lo em um array geral.

Então, digamos que você queira agrupar por masculino/feminino também e tenha um campo User.sex, que não é um 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'
));

Isso retornaria (algo 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
                )

        )
)

Assim, para consistência, a profundidade extra está sempre presente, mesmo que você use apenas campos calculados