【问题标题】:Generate headline for each month, sorted by month为每个月生成标题,按月排序
【发布时间】:2014-09-13 05:14:22
【问题描述】:

我使用 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 月等。我该怎么做?

【问题讨论】:

    标签: php mysql sql sorting for-loop


    【解决方案1】:

    为什么要使用循环?

    $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
        }
    }
    

    【讨论】:

      【解决方案2】:

      这样做没有循环:

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

      然后循环所有结果并比较字段“月”以根据需要处理每个月...

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

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

      【讨论】:

        【解决方案3】:
        for ($i = 1; $i < 13; $i++)
        

        这不是你要找的吗?

        【讨论】:

          【解决方案4】:

          只需将for循环改成如下?

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

          【讨论】:

            猜你喜欢
            • 2021-06-13
            • 2018-08-12
            • 2018-06-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-25
            • 1970-01-01
            相关资源
            最近更新 更多