我正在修改我的新闻系统的导航,并希望使用最少的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)
整个下午我一直在修补这个没有成功。我认为最好留给绝对专家。一只手好吗?
答案 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