使用PHP对XML输出进行分层排序

时间:2012-03-22 16:17:12

标签: php mysql sorting loops

我正在修改我的新闻系统的导航,并希望使用最少的MySQL查询。我已经设法将它全部归结为一个查询,但似乎有些错误。任何帮助将不胜感激。

我希望实现的是(字面上)以下事件概述,每年和每月按层次排序,以及该月的事件数量:

2012
--04 (3)
--02 (1)
--01 (1)
2011 
--12 (3)
--11 (2)
--10 (3) 
--09 (1)
--07 (1)
--02 (1)

我很亲密。我的查询如下:

SELECT start_date, date_format(start_date, "%Y") as year, date_format(start_date, "%m") as month FROM event ORDER BY start_date desc

然后,我的PHP循环如下:

    $year           = '';
    $year_counter   = 0;
    $month      = '';
    $month_counter  = 1;
    while($row = mysql_fetch_assoc($result)){
        if ( $year != $row['year'] ) {
            $year = $row['year'];
            $output .= $year.'<br />';
        }   
        if ( $month == $row['month'] ) {
            $month_counter++;
        } else {
            $month = $row['month'];
            $output .= '--'.$month.' ('.$month_counter.')<br />';
            $month_counter = 1;
        } 
    }

除了每月发生的事件数量之外,其中一切都完美无缺,似乎总是一行(你可以看看上面想要的结果的差异)。

2012
--04 (1)
--02 (3)
--01 (1)
2011
--12 (1)
--11 (3)
--10 (2)
--09 (3)
--07 (1)
--02 (1)

整个下午我一直在修补这个没有成功。我认为最好留给绝对专家。一只手好吗?

3 个答案:

答案 0 :(得分:1)

$month = $row['month'];

是在错误的地方。它为新月设置了$ month-variable,但它一直在计算它之前几个月的数字。

第一次通过while循环

if ( $month == $row['month'] )

永远不会是真的,所以它会进入else语句,显示月份和计数(因为你在顶部将它设置为1,所以为1)...

答案 1 :(得分:1)

目前,您在下个月更新月份之前打印month_counter。在while循环之前,您需要根据检索到的第一行而不是默认值初始化变量。

if ($row = mysql_fetch_assoc($result){
    $year = $row['year'];
    $month = $row['month'];
    $month_counter = 1;  //1 because you've already counted the first article
    // print out the first year
    $output .= $year.'<br />';
    while($row = mysql_fetch_assoc($result){
        if ( $year != $row['year'] ) {
            $year = $row['year'];
            $output .= $year.'<br />';
        }   
        if ( $month == $row['month'] ) {
            // You've found one more article for this month, so increment the count
            $month_counter++;
        } else {
            // You've hit a new month, so print out the information you collected
            // about the previous month
            $output .= '--'.$month.' ('.$month_counter.')<br />';
            $month = $row['month'];
            $month_counter = 1;
        } 
    }
}

输出年份和输出月份之间的区别在于,您还希望输出与月份相关联的计数,而没有与年份相关的其他信息。您必须在更改到下个月之前打印它。

答案 2 :(得分:0)

我可能在这里犯了一些错误,但您可以计算每个月的事件并对其进行相应的分组..类似

SELECT start_date, date_format(start_date, "%Y") as year, date_format(start_date, "%m") as month, date_format(start_date, "%Y%m") gr, COUNT(id) 
FROM event 
ORDER BY start_date desc 
GROUP BY gr