sql >> Database >  >> RDS >> Mysql

GROUP en COUNT() leeftijden in CakePHP

De resultaten die u krijgt zijn vrijwel de beste die CakePHP produceert.

Om dit te vereenvoudigen, moet u Set::combine die uw array opnieuw indexeert.

Je zou $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)'); moeten aanroepen

Dit zou een array retourneren met age als index en tellen als waarde:

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

        )

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

        )
    ...
)

De reden voor de extra diepte in de array is dat cake het model gebruikt als de sleutel voor de binnenste array als je geen berekende velden gebruikt, zodat je meerdere modellen als velden kunt invoeren en ze in verschillende arrays worden opgesplitst. Wanneer u berekende velden gebruikt, behoudt het dezelfde structuur, maar kent het model niet, dus moet het in een algemene array worden geplaatst.

Laten we zeggen dat je ook wilt groeperen op man/vrouw en dat je een User.sex-veld hebt, dat geen berekend veld is.

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

Dit zou terugkeren (zoiets als):

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
                )

        )
)

Dus voor consistentie is de extra diepte altijd aanwezig, zelfs als u alleen berekende velden gebruikt



  1. De langzaamste zoekopdrachten vinden

  2. installatie van postgres de initialisatie van het databasecluster is mislukt ( Postgresql versie 9.4.4 )

  3. DBMS-zelfstudie:een complete spoedcursus over DBMS

  4. postgresql date_trunc naar willekeurige precisie?