Mysql
 sql >> Database >  >> RDS >> Mysql

GROUP e COUNT() età in CakePHP

I risultati che ottieni sono praticamente i migliori prodotti da CakePHP.

Per semplificare dovresti usare Set::combine che reindicizza il tuo array.

Dovresti chiamare $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');

Ciò restituirebbe una matrice con età come indice e conteggiata come valore:

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

        )

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

        )
    ...
)

Il motivo della maggiore profondità nell'array è che cake utilizza il modello come chiave per l'array interno se non si utilizzano campi calcolati, in modo da poter inserire più modelli come campi e verranno suddivisi in array diversi. Quando usi i campi calcolati, mantiene la stessa struttura, ma non conosce il modello, quindi deve inserirlo in un array generale.

Quindi supponiamo che tu voglia raggruppare anche per maschio/femmina e hai un campo User.sex, che non è un campo calcolato.

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

Questo restituirebbe (qualcosa come):

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
                )

        )
)

Quindi, per coerenza, la profondità extra è sempre presente anche se utilizzi solo campi calcolati