2013-02-03 52 views
0

在我的博客上,我有一個功能,可以統計每月有多少博客文章,這些文章可以顯示在子菜單中。MySQL查詢 - 有沒有更好的方法?

它按年份循環,然後按月循環另一個循環。每次運行此查詢以計算每個月發佈的文章數量。

這是查詢:

Select * from DM_blog blog where blog.id IN 
    (SELECT entry_id FROM DM_tags_target tagstarget WHERE tagstarget.parent_id IN 
    (SELECT id FROM DM_tags tags WHERE tags.tag = '".$data['page']['id']."' AND tags.type = 'blog_target')) AND blog.publish < '".date("Y-m-d H:i:s")."' and blog.status = '0' and YEAR(blog.publish) = '".$year."' and MONTH(blog.publish) = '".$month."'" 

有沒有更好的方式來做到這一點?我可以一次完成所有的月份,而不必每年做12次查詢嗎?完整的代碼是在這裏:

$this->benchmark->mark('blog_submenu_start'); 
    $dates = $this->blog_model->menu_dates($data); 
    if($dates['years']){ 
     $i = 0; 
     foreach($dates['years'] as $year){ 
      if($data['segments']['modal'] == $year['YEAR(blog.publish)']){ 
       $data['date_submenu']['year'][$year['YEAR(blog.publish)']]['class'] = 'selected'; 
       $selected = true; 
      }else if(date("Y") == $year['YEAR(blog.publish)'] && $selected == false){ 
       $data['date_submenu']['year'][$year['YEAR(blog.publish)']]['class'] = 'selected'; 
       $selected = true; 
      } 

      // find the start month 
      if($dates['first_entry'][0]['YEAR(blog.publish)'] == $year['YEAR(blog.publish)']){ 
       if($dates['first_entry'][0]['MONTH(blog.publish)'] < 2){ 
        $limit_s['start'] = '1'; 
        $limit_s['end'] = 13; 
       }else{ 
        $limit_s['start'] = $dates['first_entry'][0]['MONTH(blog.publish)']; 
        $limit_s['end'] = 12; 
       } 
      }else{ 
       $limit_s['start'] = 1; 
       $limit_s['end'] = 13; 
      } 
      // run through the months 
      $this->benchmark->mark('blog_submenu_dates_'.$year['YEAR(blog.publish)'].'_start'); 
      for($x=$limit_s['start'];$x<=$limit_s['end'];$x++){ 
       $this->benchmark->mark('blog_submenu_dates_'.$year['YEAR(blog.publish)'].'_'.$x.'_start'); 
       $this->benchmark->mark('blog_submenu_dates_'.$year['YEAR(blog.publish)'].'_'.$x.'_mysql_start'); 
       $count = $this->blog_model->month_count($year['YEAR(blog.publish)'],$x,$data); 
      $this->benchmark->mark('blog_submenu_dates_'.$year['YEAR(blog.publish)'].'_'.$x.'_mysql_end'); 
       if($last == false){ 
        $this->benchmark->mark('blog_submenu_dates_'.$year['YEAR(blog.publish)'].'_'.$x.'_selected_start'); 
        if($data['segments']['modal'] == $year['YEAR(blog.publish)'] and $data['segments']['para_one'] == $x){ 
         $data['date_submenu']['year'][$year['YEAR(blog.publish)']]['months'][$x]['class'] = 'selected'; 
        } 
        $this->benchmark->mark('blog_submenu_dates_'.$year['YEAR(blog.publish)'].'_'.$x.'_selected_end'); 
        $this->benchmark->mark('blog_submenu_dates_'.$year['YEAR(blog.publish)'].'_'.$x.'_assign_start'); 
        $data['date_submenu']['year'][$year['YEAR(blog.publish)']]['months'][$x]['month'] = $x; 
        $data['date_submenu']['year'][$year['YEAR(blog.publish)']]['months'][$x]['display_full'] = date('F',strtotime($year['YEAR(blog.publish)'].'-'.$x.'-01')); 
        $data['date_submenu']['year'][$year['YEAR(blog.publish)']]['months'][$x]['display_short'] = date('M',strtotime($year['YEAR(blog.publish)'].'-'.$x.'-01')); 
        $data['date_submenu']['year'][$year['YEAR(blog.publish)']]['months'][$x]['count'] = $count; 
        $data['date_submenu']['year'][$year['YEAR(blog.publish)']]['months'][$x]['sef'] = $year['YEAR(blog.publish)'].'/'.$x.'/'; 
        $this->benchmark->mark('blog_submenu_dates_'.$year['YEAR(blog.publish)'].'_'.$x.'_assign_end'); 
        if(date("Y") == $year['YEAR(blog.publish)'] and date("m") == $x || date("n") == $x){ 
         $last = true; 
        } // end date 
        $i++; 
        $this->benchmark->mark('blog_submenu_dates_'.$year['YEAR(blog.publish)'].'_'.$x.'_end'); 
       } // end last false 
      } // end for 
      $this->benchmark->mark('blog_submenu_dates_'.$year['YEAR(blog.publish)'].'_end'); 
     } 
    } 
    $this->benchmark->mark('blog_submenu_end'); 

$這個 - > blog_model-> MONTH_COUNT - 此功能如下:

function month_count($year,$month,$data=false){ 
    $query = $this->db->query("Select * from DM_blog blog where blog.id IN 
    (SELECT entry_id FROM DM_tags_target tagstarget WHERE tagstarget.parent_id IN 
    (SELECT id FROM DM_tags tags WHERE tags.tag = '".$data['page']['id']."' AND tags.type = 'blog_target')) AND blog.publish < '".date("Y-m-d H:i:s")."' and blog.status = '0' and YEAR(blog.publish) = '".$year."' and MONTH(blog.publish) = '".$month."'"); 
    return $query->num_rows(); 
} 
+1

mysql側有year()和month()函數。如果你使用它們,你可以從查詢中直接得到分組結果 –

+0

看看這裏有更好的方法來做你想做的事情:http://stackoverflow.com/questions/3366895/group-by-month-and -year-in-mysql - 將它與計數功能結合起來,你應該被設置。 – FreudianSlip

回答

0

你可以使用一個GROUP BY表達式:

SELECT id, YEAR(blog.publish), MONTH(blog.publish) 
    FROM DM_blog blog 
WHERE blog.id IN 
(SELECT entry_id 
    FROM DM_tags_target tagstarget 
    WHERE tagstarget.parent_id IN 
     (SELECT id 
      FROM DM_tags tags 
      WHERE tags.tag = '".$data['page']['id']."' 
       AND tags.type = 'blog_target' 
     ) 
) 
AND blog.publish < '".date("Y-m-d H:i:s")."' 
AND blog.status = '0' 
GROUP BY YEAR(blog.publish), MONTH(blog.publish) 

它會給你按年份和月份分組的結果

1

您可以添加group by子句按年份和mont分組結果H。

Select * from DM_blog blog where blog.id IN 
(SELECT entry_id FROM DM_tags_target tagstarget WHERE tagstarget.parent_id IN 
(SELECT id FROM DM_tags tags WHERE tags.tag = '".$data['page']['id']."' AND tags.type =  'blog_target')) AND blog.publish < '".date("Y-m-d H:i:s")."' and blog.status = '0' GROUP BY  YEAR(blog.publish), MONTH(blog.publish) 
相關問題