Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何按月分组+;一年?_Php_Mysql_Grouping - Fatal编程技术网

Php 如何按月分组+;一年?

Php 如何按月分组+;一年?,php,mysql,grouping,Php,Mysql,Grouping,如你所见,这里我有一个很长的条目列表,按日期排序,非常简单。例如,在mysql中,只有“name”和“date”列。如果我想用php制作一个列表,那也很简单,只需按日期排序 但是,如示例所示,我如何将月+年放在两者之间呢?比如: 2010年6月 特拉拉 拉拉 瓦拉 2010年5月 特拉拉 拉拉 瓦拉 在SQL Server中,它将像下面这样简单,我可以想象mysql有类似的功能: 按年份(日期)、月份(日期)分组有十几种方法可以剥这只猫的皮,但我的方法可能是这样的(都是粗略的代码片段,不是

如你所见,这里我有一个很长的条目列表,按日期排序,非常简单。例如,在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 ism
TRUNC(动作时间,'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。但通常情况下,我所看到的所有三个似乎总是非常接近所有的核心功能。记住,这将是非常耗费资源的,如果你经常这样做的话,考虑添加字段仅用几个月和几年(在插入之前计算它们)。我已经多次对“数据”进行非规范化处理,添加这两列(并为它们编制索引),以便在以后的选择中最大限度地提高性能。