Php 如何按月分组+;一年?
如你所见,这里我有一个很长的条目列表,按日期排序,非常简单。例如,在mysql中,只有“name”和“date”列。如果我想用php制作一个列表,那也很简单,只需按日期排序 但是,如示例所示,我如何将月+年放在两者之间呢?比如: 2010年6月Php 如何按月分组+;一年?,php,mysql,grouping,Php,Mysql,Grouping,如你所见,这里我有一个很长的条目列表,按日期排序,非常简单。例如,在mysql中,只有“name”和“date”列。如果我想用php制作一个列表,那也很简单,只需按日期排序 但是,如示例所示,我如何将月+年放在两者之间呢?比如: 2010年6月 特拉拉 拉拉 瓦拉 2010年5月 特拉拉 拉拉 瓦拉 在SQL Server中,它将像下面这样简单,我可以想象mysql有类似的功能: 按年份(日期)、月份(日期)分组有十几种方法可以剥这只猫的皮,但我的方法可能是这样的(都是粗略的代码片段,不是
- 特拉拉
- 拉拉
- 瓦拉
- 特拉拉
- 拉拉
- 瓦拉
按年份(日期)、月份(日期)分组
有十几种方法可以剥这只猫的皮,但我的方法可能是这样的(都是粗略的代码片段,不是完整的实现)
首先是查询
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; ?>
我们做本月吨位分组。我使用这个表达式将任意时间戳截断为表示月份第一个月的时间戳
TIMESTAMP(DATE_FORMAT(action_time,'%Y-%m-01'))
这与Oracle ismTRUNC(动作时间,'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'))
这具有概念上的优势,即它保持了月份截断数据的时间性,因此,如果需要,您仍然可以计算时间差,并在需要时执行其他timey和datey操作
正如拉文所指出的,有一个小的性能损失(但这并不坏!)。我们的一些表列是使用此函数加载的,因此它们已被截断。该死!比我快42秒。据我所知,这是正确的。@RedFilter,我试图在我的回答中涵盖这一点-到目前为止,我只研究了来自SQL Server/Oracle背景的mySQL。但通常情况下,我所看到的所有三个似乎总是非常接近所有的核心功能。记住,这将是非常耗费资源的,如果你经常这样做的话,考虑添加字段仅用几个月和几年(在插入之前计算它们)。我已经多次对“数据”进行非规范化处理,添加这两列(并为它们编制索引),以便在以后的选择中最大限度地提高性能。