2009-08-19 5 views
2

J'essaie de faire quelque chose de relativement simple ici. Fondamentalement, j'ai une table avec un tas de lignes en elle marquée d'un horodatage (format: 2009-05-30 00:14:57).Comment faire pour décomposer les rapports par mois avec php et mysql?

Ce que je voulais faire est une requête qui sort toutes les lignes, et les divise par mois, donc je suis parti avec un résultat final comme:

Février
pour nom rowID Date
nom rowID date de commande
nom rowID ordre des dates

janvier
nom rowID date de commande
nom rowID ordre des dates
ROWI Nom D Date de commande

etc.

J'ai quelques idées vagues comment faire - ils semblent verbeux.

L'une des façons serait de faire une requête pour chaque mois. Je dériverais ce que le mois courant est en PHP puis construirais un for() qui remonte à un certain nombre de mois.

aime:

$currentmonth = 8; 

$last6months = $currentmonth - 6; 

for($i = $currentmonth; $i == $last6months; $i--) { 

    $sql = 'SELECT * FROM reports WHERE MONTH(reports.when) = $currentmonth '; 

    $res = mysql_query($sql); 


    // something would go here to convert the month numeral into a month name $currentmonthname 

    echo $currentmonthname; 

    while($row = mysql_fetch_array($res)) { 

      // print out the rows for this month here 


    } 

} 

Y at-il une meilleure façon de le faire?

Répondre

3

ne pas oublier que vous avez à traiter avec des années aswell. Si vous avez deux enregistrements, un pour janvier 2009 et un pour janvier 2008, vos résultats peuvent être faussés.

Il est préférable de suivre les conseils de Svetlozar et d'aller chercher toutes les données à la fois. Une fois que vous avez en mémoire, utiliser PHP pour segmenter en quelque chose d'utile:

$monthData = array(); 

$queryResult = mysql_query(" 
    SELECT 
     *, 
     DATE_FORMAT('%m-%Y', when) AS monthID 
    FROM 
     reports 
    WHERE 
     YEAR(when) = 2009 AND 
     MONTH(when) BETWEEN 5 and 11 
"); 

while ($row = mysql_fetch_assoc($queryResult)) 
{ 
    if (!isset($monthData[$row['monthID']])) 
     $monthData[$row['monthID']] = array(); 

    $monthData[$row['monthID']][] = $row; 
} 

mysql_free_result($queryResult); 

foreach($monthData as $monthID => $rows) 
{ 
    echo '<h2>Data for ', $monthID, '</h2>'; 
    echo '<ul>'; 

    foreach($rows as $row) 
    { 
     echo '<li>', $row['someColumn'], '</li>'; 
    } 

    echo '</ul>'; 
} 
5

Il est préférable de récupérer toutes les données une fois, commandé par mois ..

Ensuite, en allant chercher avec php, vous pouvez stocker votre mois en cours dans une variable (par exemple curMonth de $) et s'il y a un changement dans le mois , vous echo « Nouveau mois » ...

exécution d'une requête est lente, il est préférable de minimiser vos « conversations » avec le db ..

+1

pouvez-vous me donner un exemple? – SamotnyPocitac

1

Vous pouvez modifier votre requête SQL pour obtenir votre rapport complet. C'est beaucoup plus efficace que d'interroger la base de données dans une boucle.

 
select 
    monthname(reports.when) as currentmonth, 
    other, 
    fields, 
    go, 
    here 
from reports 
order by 
    reports.when asc 

Vous pouvez ensuite utiliser cette boucle pour créer un rapport imbriqué:

 
var $currentMonth = ''; 

while($row = mysql_fetch_array($res)) { 
    if($currentMonth !== $row['currentMonth']) { 
     $currentMonth = $row['currentMonth']); 
     echo('Month: ' . $currentMonth); 
    } 

    //Display report detail for month here 
} 

* Note: Non testé, mais vous voyez l'idée générale de ce que je suis sûr.

1

Voici le script SQL:

SELECT*, DATE_FORMAT(fieldname,'%Y-%m') AS report FROM bukukecil_soval WHERE MONTH(fieldname) = 11 AND YEAR(fieldname)=2011 

J'espère que vous savez où vous devez mettre ce code: D

Questions connexes