mysql |按时间分组计数记录

Posted

技术标签:

【中文标题】mysql |按时间分组计数记录【英文标题】:mysql | count records grouped by time 【发布时间】:2014-12-19 02:01:04 【问题描述】:

我有一个获取日期数组的代码(本月 - 12 日):

for ($i = 0; $i <= 11; $i++) 
    $months[] = date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"));

要在指定月份从数据库中获取记录,我可以使用以下代码:

$sql = 'SELECT COUNT(id) FROM `#__records` WHERE MONTH(date)=1 AND YEAR(date)=2010';

创建按月获取数据的请求很热门吗? 谢谢!

【问题讨论】:

【参考方案1】:

您可以使用适当的GROUP BY 查询直接在 SQL 中执行此操作。

诀窍就是这个小表情。给定任何 DATE 或 DATETIME`,它会产生该月的第一天。

DATE(DATE_FORMAT(datevalue, '%Y-%m-01'))

查询大量使用该公式来解决问题。

试试这个:

SELECT COUNT(id) AS idcount,
       DATE(DATE_FORMAT(date, '%Y-%m-01')) AS month_beginning
  FROM table
 WHERE date >= DATE(DATE_FORMAT(NOW(), '%Y-%m-01')) - INTERVAL 12 MONTH
   AND date <  DATE(DATE_FORMAT(NOW(), '%Y-%m-01')) + INTERVAL 1 MONTH
  GROUP BY DATE(DATE_FORMAT(date, '%Y-%m-01'))
  ORDER BY DATE(DATE_FORMAT(date, '%Y-%m-01'))

这会为最近十二个月的每一个月返回一行。

这里有关于这种摘要查询的更广泛的文章。 http://www.plumislandmedia.net/mysql/sql-reporting-time-intervals/

【讨论】:

如果你尝试SELECT id, DATE(DATE_FORMAT(date, '%Y-%m-01')) FROM table,你会得到什么?你得到正确的月初日期吗?另外,也许你应该在反引号中包含列名date,因为它是一个保留字。【参考方案2】:

试试这个

for ($i = 0; $i <= 11; $i++) 
    $months[] = date("Y-m", strtotime( date( 'Y-m-01' )." -$i months"));


$count = sizeof($months);

 for($i=0;$i<$count;$i++)
 
    $sql = 'SELECT COUNT(id) AS id FROM `#__records` WHERE MONTH(date)='".$months[$i]."' AND YEAR(date)=2010';
    $result = mysql_query($sql);
    if($result)

$data_array = array();
    $data = mysql_fetch_assoc($result);
    if($data)
    
        $data_array[] = array($data['id']);
    


print_r($data_array);

【讨论】:

以上是关于mysql |按时间分组计数记录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:按连续天分组并计数组

MySQL 按日期和计数分组,包括丢失的日期

数据库查询选择所有列,包括按“分组依据”的每条记录的计数

MySQL按天计数和分组

MySQL = 按月份分组销售计数,然后将月份显示为名称(Jan、Feb...DEC)而不是数值(1、2、3-12)

按地理(或几何)分组的聚合/计数行