Mysql
 sql >> Base de données >  >> RDS >> Mysql

Âges GROUP et COUNT() dans CakePHP

Les résultats que vous obtenez sont à peu près les meilleurs produits par CakePHP.

Pour simplifier cela, vous devez utiliser Set::combine qui réindexe votre tableau.

Vous auriez besoin d'appeler $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');

Cela renverrait un tableau avec age comme index et compter comme valeur :

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

        )

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

        )
    ...
)

La raison de la profondeur supplémentaire dans le tableau est que cake utilise le modèle comme clé pour le tableau interne si vous n'utilisez pas de champs calculés, de sorte que vous pouvez mettre plusieurs modèles en tant que champs et ils seront divisés en différents tableaux. Lorsque vous utilisez des champs calculés, il conserve la même structure, mais ne connaît pas le modèle et doit donc le placer dans un tableau général.

Supposons donc que vous souhaitiez également regrouper par homme/femme et que vous ayez un champ User.sex, qui n'est pas un champ calculé.

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

Cela renverrait (quelque chose comme):

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
                )

        )
)

Ainsi, par souci de cohérence, la profondeur supplémentaire est toujours là même si vous n'utilisez que des champs calculés