如何按月+年分组?

时间:2010-08-26 15:10:03

标签: php mysql grouping

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

如您所见,这里有一长串条目,按日期排序,非常简单。因此,在mysql中,只有列'name'和'date',例如。如果我想用php创建一个列表,这也很简单,只需按日期排序。

但是我如何将月份和年份放在两者之间,如示例所示?像:

2010年6月

  • TRALA
  • 拉拉
  • 瓦剌

2010年5月

  • TRALA
  • 拉拉
  • 瓦剌

3 个答案:

答案 0 :(得分:5)

在SQL Server中,它将如下所示,我想想mysql有类似的东西:

GROUP BY Year(Date), Month(Date)

答案 1 :(得分:5)

有十几种方法来修饰这只猫,但我的方法可能就是这样(所有粗略的代码片段,而不是完整的实现)

首先是查询

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; ?>

答案 2 :(得分:1)

我们做本月分组的吨位。我使用这个表达式将任意时间戳截断为代表本月第一天的时间戳。

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

这与Oracle-ism TRUNC(action_time,'MM')

的作用相同

例如你可以做

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'))

这具有概念上的优势,即它可以保持月截断数据的时间戳,因此如果需要,您仍然可以根据需要计算时差并执行其他时间和日期的事情。

正如ravern指出的那样,性能会受到很小的惩罚(但也不错!)。我们的一些表列是使用此函数加载的,因此它们已被截断月份。