Я пытаюсь сгруппироваться датой рождения и количеством на основе результатов, с помощью 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.)
Я думаю, что вы получаете числовые индексы на массиве ваших результатов, потому что поля, которые вы добавляете, не генерируются 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'
));
Может быть, это даст вам больше удачи, получая условия для работы. :)
Какая версия CakePhp вы используете? Я думаю, что более ранние версии 1.2, и я верю, что все версии 1.1 имели некоторые проблемы с группой и сложные совокупные запросы - это было позже разрешено . То, что сказал, что результаты похожи на торт, бегают то, что вы просите это: возвращение списка веков, и количество пользователей с этим возрастом.
Независимо от того, зачем запускать это в MySQL и связать свой сервер БД? Получите необработанные значения и перепишите запрос, чтобы рассчитать агрегаты в PHP и добавить его в возвращенный массив.
Если вы должны использовать MySQL, всегда есть $ this-> Query (); Для сложных запросов ее часто стоит обойти торт, но, как я уже сказал, результаты имеют смысл, учитывая запрос.