生成每个月的标题,按月排序

时间:2014-07-22 11:41:47

标签: php mysql sql sorting for-loop

我使用for()来生成每个月的标题,并从数据库中选择相应的数据,如下所示:

$year = '2013';

for ($i = 12; $i > 0; $i--) {
    $sql = "SELECT stuff 
    FROM table 
    WHERE year(date) = '".$year."'
    and month(date) = '".$i."'
    ORDER BY date ASC";
    $result = mysql_query($sql) or print ("Unable to select data.<br />" . $sql . "<br />" . mysql_error());
    $num = mysql_num_rows($result);
    if ($num > 0) { 
        echo '<h3>'.date('F', mktime(0, 0, 0, $i, 1, $year)).'</h3>';
        while ($row = mysql_fetch_array($result)) {
            // stuff
        }
    }
} 

这完全没问题。但是,每月分组数据集按DESC排序(2013年12月,2013年11月,2013年10月等)。我想以相反的方式对它们进行排序:2013年1月,2013年2月,2013年3月等。我该怎么做?

4 个答案:

答案 0 :(得分:1)

只需更改for循环,如下所示?

for ($i = 1; $i < 13; $i++) {
....
}

答案 1 :(得分:0)

for ($i = 1; $i < 13; $i++)

不是你在寻找什么?

答案 2 :(得分:0)

没有循环就这样做:

$sql = "SELECT stuff, month(date) AS month
FROM table 
WHERE YEAR(date) = '".$year."'
ORDER BY date ASC";

然后循环所有结果并比较字段&#34;月&#34;按你的意愿每月处理......

while ($row = mysql_fetch_array($result)) {
    switch($row["month"]) {
        case "1":
              //Process January...
             break;
        case "2":
              //Process Fenriary...
             break;
        //And so on...
    }
}

这很多!性能更高,因为多个查询(尤其是循环中的查询)永远不会对MySQL服务器有利。它可以大大减慢您网站的加载时间并节省大量资源。

答案 3 :(得分:0)

为什么要使用循环?

$sql = "SELECT stuff 
FROM  table 
ON year(date) = '".$year."'
ORDER BY date ASC";
$result = mysql_query($sql) or print ("Unable to select data.<br />" . $sql . "<br />" . mysql_error());
$num = mysql_num_rows($result);
if ($num > 0) 
{ 
    echo '<h3>'.date('F', mktime(0, 0, 0, $i, 1, $year)).'</h3>';
    while ($row = mysql_fetch_array($result)) 
    {
        // stuff
    }
}

或者,如果您想要强制退回行,即使该月没有任何内容: -

$year = '2013';

$sql = "SELECT stuff 
FROM (SELECT 1 i UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11 UNION SELECT 12) poss_months
LEFT OUTER JOIN table 
ON year(date) = '".$year."'
and month(date) = poss_months.i
ORDER BY date ASC";
$result = mysql_query($sql) or print ("Unable to select data.<br />" . $sql . "<br />" . mysql_error());
$num = mysql_num_rows($result);
if ($num > 0) 
{ 
    echo '<h3>'.date('F', mktime(0, 0, 0, $i, 1, $year)).'</h3>';
    while ($row = mysql_fetch_array($result)) 
    {
        // stuff
    }
}