sql >> Databasteknik >  >> RDS >> Mysql

GROUP och COUNT() åldrar i CakePHP

Resultaten du får är i stort sett det bästa som CakePHP producerar.

För att förenkla detta bör du använda Set::combine som återindexerar din array.

Du skulle behöva anropa $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)');

Detta skulle returnera en array med ålder som index och räknas som värdet:

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

        )

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

        )
    ...
)

Anledningen till det extra djupet i arrayen är att cake använder modellen som nyckel för den inre arrayen om du inte använder beräknade fält, så att du kan lägga in flera modeller som fält och de kommer att delas upp i olika arrays. När du använder beräknade fält behåller den samma struktur, men känner inte till modellen så måste placera den i en allmän array.

Så låt oss säga att du vill gruppera efter man/kvinna också och du har ett User.sex-fält, vilket inte är ett beräknat fält.

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

Detta skulle returnera (något liknande):

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
                )

        )
)

Så för konsekvensen finns det extra djupet alltid där även om du bara använder beräknade fält



  1. Behöver återställa värdet på sekvensen i Oracle

  2. Bevilja privilegier på framtida bord i PostgreSQL?

  3. Kan inte öppna och låsa privilegietabeller:Tabell 'mysql.user' existerar inte

  4. Hur utför jag en GROUP BY på en aliasad kolumn i MS-SQL Server?