2010-08-17 6 views
2

Je suis un peu coincé en essayant de sortir mon code correctement, voir ci-dessous. Tout fonctionne bien, mais plutôt que d'afficher toutes les nouvelles, il n'en affiche qu'un pour chaque mois. Ce que je dois faire est de regrouper toutes les nouvelles pour un mois sélectionné avec le mois/année pour ce mois. J'espère que cela a du sens.Archive des nouvelles PHP/MySQL

Toute aide grandement appréciée. SS

$theQuery="Select * from isnews WHERE active = '1' GROUP BY YEAR(date) DESC, MONTH(date) ORDER BY YEAR(date) DESC, MONTH(date) DESC";  
    $newsQuery=mysql_query($theQuery);  
    if(mysql_num_rows($newsQuery)>0) {  
    while ($newsResult=mysql_fetch_array($newsQuery)) {   
    $newDate = $newsResult['date'] ;    
    echo '<div class="date">' . date('F Y ',strtotime($newDate)) . '</div>';   
    echo '<ul class="press">';   
    echo '<li> 
    <img src="'.$wwwUrl.'images/news/'.$newsResult['image'].'" width="'.$newsResult['tnWidth'].'" height="'.$newsResult['tnHeight'].'" title="'.$newsResult['title'].'" alt="'.$newsResult['title'].'" /> 
    <h3><a href="press-releases/'.$newsResult["id"].'/'.$newsResult["title"].'.php">'.$newsResult["title"].'</a></h3>   
    '.substr($newsResult['descrip'],0,100).' 
    <p><a href="press-releases/'.$newsResult["id"].'/'.$newsResult["title"].'.php">Read more</a></p> 
    </li>'; 
    } 
    echo '</ul>'; 
    } else { 
    echo 'We currently have no press releases available'; 
    } 

Répondre

2

Il y a deux problèmes que je peux voir. Tout d'abord, GROUP BY est une fonction d'agrégat, elle est donc utilisée pour combiner plusieurs lignes dans une ligne de votre résultat (par exemple, si vous voulez voir combien de nouvelles ont été écrites pour un mois et une année donnés). Deuxièmement, même si vous obteniez plusieurs enregistrements par période, vous produisez un en-tête de date pour chaque enregistrement que vous extrayez de la base de données (vous obtiendrez des en-têtes dupliqués si vous avez plusieurs articles du même mois et de la même année).

Une meilleure solution serait de recueillir toutes vos nouvelles actives (sans la clause GROUP BY), puis construire un tableau que vous pouvez ensuite itérer sur la sortie de votre page:

$query = "SELECT * 
    FROM isnews 
    WHERE active = '1' 
    ORDER BY YEAR(date) DESC, MONTH(date) DESC"; 
$resultSet = mysql_query($query); 

if (mysql_num_rows($resultSet)) 
{ 
    $newsArray = array(); 
    while ($newsResult = mysql_fetch_array($resultSet)) 
    { 
    // The time period is what you will output as your header 
    $timePeriod = intval(date("F Y", $newsResult['date'])); 

    if (!isset($newsArray[$timePeriod])) 
    { 
     // Create a subarray if needed 
     $newsArray[$timePeriod] = array(); 
    } 

    $newsArray[$timePeriod][] = $newsResult; 
    } 

    foreach ($newsArray as $timePeriod => $newsItems) 
    { 
    echo '<div class="date">' . $timePeriod . '</div>';   
    echo '<ul class="press">'; 

    foreach ($newsItems as $item) 
    { 
    echo '<li>'; 
    // ... do your news item outputting 
    echo '</li>'; 
    } 

    echo '</li>'; 
    echo '</div>'; 
    } 
} 
else 
{ 
    echo 'We currently have no press releases available'; 
} 
+0

Wow, c'est incroyable! Beaucoup, merci beaucoup pour votre aide, fonctionne comme un régal! – ss888

0

il une montre que pour chaque mois

C'est exact, votre GROUP BY est incorrect. Toutes les colonnes (voir le *) devraient être dans votre GROUP BY car elles sont toutes dans le SELECT et vous n'utilisez aucune fonction d'agrégat. MySQL a un comportement très étrange et ne renvoie maintenant que le premier enregistrement qu'il peut trouver.

Si vous voulez tous les enregistrements, il suffit de supprimer l'ensemble GROUP BY, et ORDER BY le mois et l'année pour obtenir l'ordre de tri correct. En PHP vous pouvez faire quelques groupes, mais cela n'a rien à voir avec SQL.

Vous pourriez envisager ONLY_FULL_GROUP_BY, cela permet d'éviter les résultats étranges/faux.

+0

Regroupement par toutes les colonnes qu'il veut recueillir ne sera pas utile dans ce cas, car à moins que des enregistrements en double, il retournera chaque ligne ... de toute façon –

+0

Offcourse il a gagné ne t'aide pas. Mais il doit comprendre pourquoi cela ne va pas aider et à quoi sert GROUP BY, ce qu'il fait. –

1

Un grand merci pour la Aidez-moi.

J'ai essayé d'adapter un peu le code de Daniel afin de créer une liste d'archives de type barre latérale montrant les années, puis les mois et les résultats correspondants. Le résultat final est un menu de type accordéon où les années déroulantes pour afficher les mois, puis les mois déroulant pour afficher les nouvelles. Je peux le faire fonctionner aussi loin que les années passent, mais je n'arrive pas à faire fonctionner les mois correctement.

Tous les pointeurs/aide plus que grandement appréciés. (Code ci-dessous) SS

$query = "SELECT * FROM isnews WHERE active = '1' ORDER BY YEAR(date) DESC, MONTH(date) DESC"; 
         $resultSet = mysql_query($query); 

         if (mysql_num_rows($resultSet)) 
         { 
         $newsArray = array(); 

         echo '<ul>' . PHP_EOL; 
         echo '<li><strong>Press releases:</strong></li>' . PHP_EOL; 

         while ($newsResult = mysql_fetch_array($resultSet)) 
         {         
         $newDate = $newsResult['date'] ; 
         $timePeriod = date('F Y ',strtotime($newDate)); 
         $timePeriodY = date('Y',strtotime($timePeriod)); 
         $timePeriodM = date('F',strtotime($timePeriod)); 

         if (!isset($newsArray[$timePeriodY])) 
         { 
         $newsArray[$timePeriodY] = array(); 
         } 
         $newsArray[$timePeriodY][] = $newsResult;       
         } 
         foreach ($newsArray as $timePeriodY => $newsItems) 
         {                       
         echo '<li><em>' . $timePeriodY . '</em>' . PHP_EOL; 
         echo '<ul>' . PHP_EOL; 

         foreach ($newsItems as $item) 
         { 
         echo '<li>'; 
         echo '<a href="press-releases/'.$item["id"].'/'.$item["title"].'.php">'.$item["title"].'</a>'; 
         echo '</li>' . PHP_EOL; 
         }       
         echo '</ul>' . PHP_EOL; 
         echo '</li>' . PHP_EOL;    
          } 
          echo '</ul>' . PHP_EOL; 
         } 
         else 
          { 
         echo 'We currently have no press releases available'; 
         }