#mysql #sql #cakephp #datetime
#mysql #sql #cakephp #дата и время
Вопрос:
У меня есть таблица отчетов, и я хочу сгруппировать их по созданной дате. У каждого есть созданное поле, которое является datetime.
Я пытался сделать это:
$reports = $this->Report->find('all', array(
'recursive' => 0,
'group' => 'DATE(created)'
));
который вернул правильное количество групп (3, потому что у меня много записей, но на данный момент только 3 разные даты), но возвращает только одну запись на группу.
В соответствии с ответом @Kai группировка sql также вернет одну уникальную запись.
Я хочу отобразить таблицу результатов с заголовком таблицы, разделяющим результаты для каждой сгруппированной даты. Какой был бы лучший способ CakePHP для достижения этого?
Ответ №1:
Я думаю, вы путаете понятия GROUP BY
и ORDER BY
в mysql.
Группировать по
GROUP BY
имеет смысл только в определенных контекстах. Например, если у вас была таблица, содержащая продукты с категорией и ценой, и вы хотели получить продукт с максимальной ценой для каждой категории. Если вы просто используете SELECT MAX(price) FROM products
, вы получите единственный самый дорогой продукт в вашей таблице. Вот где GROUP BY
появляется: SELECT MAX(price) FROM products GROUP BY category_id
. GROUP BY
всегда будет получать одну строку на уникальное значение в указанном вами столбце GROUP BY
. В моем примере это означает, что с GROUP BY
помощью он получит одну строку для идентификатора категории, поэтому я смогу увидеть максимальную цену для каждой категории.
Порядок по
ORDER BY
это говорит само за себя — он упорядочит ваши результаты по указанному вами столбцу.
Итак, возвращаясь к вашему вопросу, вы должны использовать ORDER BY
, а не GROUP BY
.
$reports = $this->Report->find('all', array(
'recursive' => 0,
'order' => 'DATE(created)'
));
ETA:
Что касается создания таблицы ваших результатов, где каждая дата разделяется заголовком таблицы, действуйте так, как если бы вы собирались создать обычную таблицу без этих разделителей, но сохраните дату в первой строке во временной переменной. На каждой итерации сверяйте вашу временную переменную с датой этой строки. Если дата строки отличается, вставьте свой заголовок и обновите временную переменную до даты текущей строки. Вот некоторый псевдокод, который поможет прояснить:
echo '<table>';
//echo your first set of headers.
$temp = $report[0]['Report']['created'];
foreach($data as $report)
{
if($temp != $report['Report']['created'])
{
//echo your headers
$temp = $report['Report']['created'];
}
//echo your row of data here.
}
echo '</table>';
Комментарии:
1. Спасибо, ваш ответ имеет смысл, я обновил свой вопрос на основе вашего ответа. OrderBy все равно не поможет мне достичь «сгруппированного» результата.
2. @Ronnyvdb я обновил свой ответ способом, которым вы можете создать свою таблицу.