Как группировать по месяцам + годам? - PullRequest
2 голосов
/ 26 августа 2010

http://www.bioshapebenefits.nl/bioshapebenefits/en/news/donations.html

Как видите, здесь у меня есть длинный список записей, отсортированных по дате, очень простой.Так, в mysql будут только столбцы «имя» и «дата», например.И если бы я хотел сделать из него список с php, который также был бы очень простым, просто сортировкой по дате.

Но как бы я поставил месяцы + годы между ними, как показано в примере?Как:

Июнь 2010

  • Трала
  • Лала
  • Вала

Май 2010

  • Трала
  • Лала
  • Вала

Ответы [ 3 ]

5 голосов
/ 26 августа 2010

Существует десяток способов обрезать эту кошку, но мой подход, вероятно, будет таким (все грубые фрагменты кода, а не полная реализация)

Сначала запрос

select `name`
     , month(`date`) as date_month
     , year(`date`) as date_year
  from [Table]
 order by `date` desc

Затем организуйте данные в нужные логические группы

$templateData = array();
foreach ( $rows as $row )
{
  $templateData[$row->date_year][$row->date_month][] = $row->name;
}

Затем в шаблоне

<?php foreach ( $templateData as $year => $months ) : ?>
  <?php foreach ( $months as $month => $names ) : ?>
    <h2><?php echo $month, ' ', $year; ?></h2>
    <ul>
      <?php foreach ( $names as $name ) : ?>
        <li><?php echo $name; ?></li>
      <?php endforeach; ?>
    </ul>
  <?php endforeach; ?>
<?php endforeach; ?>
5 голосов
/ 26 августа 2010

В SQL Server это было бы так просто, как показано ниже, я думаю, что MySQL имеет нечто подобное:

GROUP BY Year(Date), Month(Date)

1 голос
/ 27 августа 2010

Мы делаем тоннаж этого месяца группировки.Я использую это выражение для усечения произвольных временных отметок до временных отметок, представляющих первое число месяца.

   TIMESTAMP(DATE_FORMAT(action_time,'%Y-%m-01'))

Это делает то же самое, что и Oracle-ism TRUNC(action_time,'MM')

Например, вы могли быdo

SELECT COUNT(*) NUM, TIMESTAMP(DATE_FORMAT(t.action_time,'%Y-%m-01')) MONTH
FROM TABLE t
GROUP BY TIMESTAMP(DATE_FORMAT(t.action_time,'%Y-%m-01'))

Это имеет концептуальное преимущество, заключающееся в том, что он сохраняет временную метку усеченных за месяц данных, поэтому, если вам нужно, вы все равно можете вычислять разницу во времени и делать другие своевременные и своевременные действия, если вам это необходимо.

Как указывал Раверн, есть небольшое снижение производительности (но это не плохо!).Некоторые из наших столбцов таблицы загружаются с помощью этой функции, поэтому они уже усечены по месяцам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...