如何用php和mysql按月分解报告?

时间:2009-08-19 06:05:47

标签: php mysql

我想在这里做一些相对简单的事情。基本上我有一个表格,里面有一堆标有时间戳的行(格式:2009-05-30 00:14:57)。

我想要的是一个查询,它会拉出所有行,并按月分割它们,所以我留下了最终结果,如:

二月
rowID名称订单日期
rowID名称订单日期
rowID名称订单日期

一月
rowID名称订单日期
rowID名称订单日期
rowID名称订单日期

我有一些模糊的想法如何做到这一点 - 他们似乎只是啰嗦。

其中一种方法是每个月进行一次查询。我将得到当前月份在PHP中的内容然后构造一个for(),它可以追溯到几个月。

像:

$currentmonth = 8;

$last6months = $currentmonth - 6;

for($i = $currentmonth; $i == $last6months; $i--) {

     $sql = 'SELECT * FROM reports WHERE MONTH(reports.when) = $currentmonth ';  

     $res = mysql_query($sql);


     // something would go here to convert the month numeral into a month name $currentmonthname

     echo $currentmonthname;

     while($row = mysql_fetch_array($res)) {

           // print out the rows for this month here


     }

}

有更好的方法吗?

4 个答案:

答案 0 :(得分:5)

最好一次获取所有数据,按月排序..

然后在使用php获取时,您可以将当前月份存储在变量中(例如$ curMonth),如果月份有变化,则回显“新月”......

执行查询的速度很慢,最好尽量减少与db的“对话”..

答案 1 :(得分:3)

不要忘记,你必须处理多年。如果你有两个记录,一个是09年1月,一个是08年1月,你的结果可能会有偏差。

最好遵循Svetlozar的建议并立即获取所有数据。一旦你在内存中使用它,使用PHP将其分割成有用的东西:

$monthData = array();

$queryResult = mysql_query("
    SELECT 
        *, 
        DATE_FORMAT('%m-%Y', when) AS monthID
    FROM
        reports
    WHERE 
        YEAR(when) = 2009 AND 
        MONTH(when) BETWEEN 5 and 11
");

while ($row = mysql_fetch_assoc($queryResult))
{
    if (!isset($monthData[$row['monthID']]))
        $monthData[$row['monthID']] = array();

    $monthData[$row['monthID']][] = $row;
}

mysql_free_result($queryResult);

foreach($monthData as $monthID => $rows)
{
    echo '<h2>Data for ', $monthID, '</h2>';
    echo '<ul>';

    foreach($rows as $row)
    {
        echo '<li>', $row['someColumn'], '</li>';
    }

    echo '</ul>';
}

答案 2 :(得分:1)

您可以更改SQL查询以获取整个报告。这比循环查询数据库更有效。

select
    monthname(reports.when) as currentmonth,
    other,
    fields,
    go,
    here
from reports
order by
    reports.when asc

然后,您可以使用此循环创建嵌套报告:

var $currentMonth = '';

while($row = mysql_fetch_array($res)) {
    if($currentMonth !== $row['currentMonth']) {
        $currentMonth = $row['currentMonth']);
        echo('Month: ' . $currentMonth);
    }

    //Display report detail for month here
}

*注意:未经测试,但你肯定会得到它的一般要点。

答案 3 :(得分:1)

这是SQL脚本:

SELECT*, DATE_FORMAT(fieldname,'%Y-%m') AS report FROM bukukecil_soval WHERE MONTH(fieldname) = 11 AND YEAR(fieldname)=2011

我希望你知道应该把这段代码放在哪里:D