ГРУППА и КОЛИЧЕСТВО () возрасты в CakePHP

Я пытаюсь сгруппироваться датой рождения и количеством на основе результатов, с помощью CakePHP. Вот мой запрос.

$data = $this->User->find('all', array(
    'fields' => array(
        "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(id)'
    ),
    'group' => 'age'
));

Пока все хорошо. Поле User.dob дата рождения, это - a DATETIME поле.

Вещь, она возвращает что-то вроде этого:

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

        )

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

        )

    [2] => Array
        (
            [0] => Array
                (
                    [age] => 11
                    [COUNT(id)] => 1
                )

        )

    [3] => Array
        (
            [0] => Array
                (
                    [age] => 12
                    [COUNT(id)] => 8
                )

        )

    [4] => Array
        (
            [0] => Array
                (
                    [age] => 13
                    [COUNT(id)] => 1
                )

        )

Конечно, должен быть лучший путь.

И я не могу даже отфильтровать его. Этот код бросает ошибку. Неизвестный столбец 'возраст'

$data = $this->User->find('all', array(
    'conditions' => array('age >' => 20),
    'fields' => array(
        "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(id)'
    ),
    'group' => 'age'
));

Между прочим, это запросы.

SELECT 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(id) FROM `users` AS `User` WHERE 1 = 1 GROUP BY age 

(Стандартная программа вычисления возраста была найдена в блоге matt.)

5
задан metrobalderas 26 January 2010 в 19:15
поделиться

2 ответа

Я думаю, что вы получаете числовые индексы на массиве ваших результатов, потому что поля, которые вы добавляете, не генерируются CakePhp. CakePhP обычно генерирует запросы (и имена полей), больше похоже на это в SQL:

SELECT `Item`.`id`, `Item`.`name` FROM `items` AS `Item` WHERE 1 = 1 ORDER BY `Item`.`name` ASC

. Вы должны попробовать имитировать конвенции по именованию поля CakePhp при добавлении пользовательских элементов в ваши запросы, если вы хотите, чтобы CakePhp лучше понять и отформатировать результаты, возвращающиеся из MySQL :

$age = "DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(User.dob, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(User.dob, '00-%m-%d'))";
$data = $this->User->find('all', array(
    'conditions' => array('User.age >' => 20),
    'fields' => array(
        $age . ' AS `User`.`age`',
        'COUNT(id) AS `User`.`count`'
    ),
    'group' => 'User.age'
));

Может быть, это даст вам больше удачи, получая условия для работы. :)

2
ответ дан 14 December 2019 в 04:38
поделиться

Какая версия CakePhp вы используете? Я думаю, что более ранние версии 1.2, и я верю, что все версии 1.1 имели некоторые проблемы с группой и сложные совокупные запросы - это было позже разрешено . То, что сказал, что результаты похожи на торт, бегают то, что вы просите это: возвращение списка веков, и количество пользователей с этим возрастом.

Независимо от того, зачем запускать это в MySQL и связать свой сервер БД? Получите необработанные значения и перепишите запрос, чтобы рассчитать агрегаты в PHP и добавить его в возвращенный массив.

Если вы должны использовать MySQL, всегда есть $ this-> Query (); Для сложных запросов ее часто стоит обойти торт, но, как я уже сказал, результаты имеют смысл, учитывая запрос.

-1
ответ дан 14 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: