2010-11-12 3 views
0

Actuellement pour mon blog je reçois une liste d'années/dates en utilisant le code suivant:Génération d'une liste d'années/mois dans MySQL

$monthList = array(
     1 => 'January', 
     2 => 'February', 
     3 => 'March', 
     4 => 'April', 
     5 => 'May', 
     6 => 'June', 
     7 => 'July', 
     8 => 'August', 
     9 => 'September', 
     10 => 'November', 
     11 => 'October', 
     12 => 'December' 
    ); 
    $nav = array(); 
    for ($year = 2009; $year <= date('Y'); $year++) { 
     foreach ($monthList as $id => $month) { 
      $this->tru->query->runRaw(array(
       'name' => 'get-headline-count', 
       'sql' => 'SELECT 
         COUNT(id) as count 
        FROM 
         wp_'.$this->getId().'_posts 
        WHERE 
         post_status = \'publish\' AND 
         post_type = \'post\' AND 
         post_parent = \'0\' AND 
         YEAR(post_date) = '.$year.' AND 
         MONTH(post_date) = '.$id.'', 
       'connection' => 'article' 
      )); 
      $temp = $this->tru->query->getArray('get-headline-count'); 
      if ($temp['count'] > 0) { 
       $nav[$year][$id] = $temp['count']; 
      } 
     } 
    } 

    krsort($nav); 

    return array(
     'month' => $monthList, 
     'nav' => $nav 
    ); 

C'était génial au début, mais maintenant que j'ai eu quelques années de données et quelques mois cela ne va plus le couper. Je n'ai jamais rien fait de tel auparavant, je m'occupe habituellement des horodatages.

Répondre

1

Vous pouvez remplacer la boucle avec celui-ci requête

SELECT 
    YEAR(post_date) as yr, MONTH(post_date) as mn, COUNT(id) as count 
FROM 
    wp_posts 
WHERE 
    post_status = 'publish' AND 
    post_type = 'post' AND 
    post_parent = '0' 
GROUP BY YEAR(post_date), MONTH(post_date)