Mysql
 sql >> Datenbank >  >> RDS >> Mysql

GROUP- und COUNT()-Alter in CakePHP

Die Ergebnisse, die Sie erhalten, sind so ziemlich die besten, die CakePHP produziert.

Um dies zu vereinfachen, sollten Sie Set::combine wodurch Ihr Array neu indiziert wird.

Sie müssten $data = Set::combine($data, '{n}.0.age', '{n}.0.COUNT(id)'); aufrufen

Dies würde ein Array mit dem Alter als Index zurückgeben und als Wert zählen:

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

        )

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

        )
    ...
)

Der Grund für die zusätzliche Tiefe im Array ist, dass Cake das Modell als Schlüssel für das innere Array verwendet, wenn Sie keine berechneten Felder verwenden, sodass Sie mehrere Modelle als Felder einfügen können und diese in verschiedene Arrays aufgeteilt werden. Wenn Sie berechnete Felder verwenden, behält es dieselbe Struktur bei, kennt das Modell jedoch nicht und muss es daher in ein allgemeines Array einfügen.

Nehmen wir also an, Sie möchten auch nach Mann/Frau gruppieren und haben ein User.sex-Feld, das kein berechnetes Feld ist.

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

Dies würde zurückgeben (etwas wie):

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
                )

        )
)

Aus Konsistenzgründen ist die zusätzliche Tiefe also immer vorhanden, auch wenn Sie nur berechnete Felder verwenden