CakePHP преобразует дату и время в дату и группирует результаты

#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 я обновил свой ответ способом, которым вы можете создать свою таблицу.