2009-08-19 9 views
2

Ich versuche hier etwas relativ Einfaches zu tun. Grundsätzlich habe ich eine Tabelle mit einer Reihe von Zeilen darin mit einem Zeitstempel markiert (Format: 2009-05-30 00:14:57).Wie Berichte nach Monat mit PHP und MySQL zu brechen?

Was ich will tun ist, ist eine Abfrage, die alle Zeilen zieht, und teilt sie durch den Monat, damit ich mit einem Endergebnis links bin wie:

Februar
rowID Namen bestellen Datum
rowID Name Bestelldatum
rowID Name Bestelldatum

Januar
rowID Name Bestelldatum
rowID Name Bestelldatum
ROWI D Name Bestelldatum

usw.

Ich habe ein paar vage Ideen, wie dies zu tun - sie scheinen nur langatmig.

Eine der Möglichkeiten wäre, eine Abfrage für jeden Monat durchzuführen. Ich würde ableiten, was der aktuelle Monat in PHP ist, und dann ein for() erstellen, das eine bestimmte Anzahl von Monaten zurückreicht.

mag:

$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 


    } 

} 

Gibt es einen besseren Weg, dies zu tun?

Antwort

3

vergessen Sie nicht, dass Sie mit den Jahren zu tun haben, als gut. Wenn Sie zwei Datensätze haben, einen für Januar '09 und einen für Januar '08, sind Ihre Ergebnisse möglicherweise verzerrt.

Am besten zu Svetlozar Ratschlag folgen und alle Daten auf einmal zu holen. Sobald Sie es in Erinnerung haben, verwenden Sie PHP zu segmentieren es zu etwas nützlich:

$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

Es ist besser, wenn alle Daten zu holen, von Monat bestellt ..

Dann, während mit PHP holen Sie Ihren aktuellen Monat in einer Variablen (zB $ curMonth) speichern können, und wenn es eine Änderung im Monat Sie „New Month“ echo ...

Ausführen einer Abfrage langsam ist, ist es besser, Ihre „Gespräche“ mit dem db zu minimieren ..

+1

können Sie mir ein Beispiel nennen? – SamotnyPocitac

1

Sie Ihre SQL-Abfrage ändern könnten Ihren gesamten Bericht zu erhalten. Dies ist viel effizienter, als die Datenbank in einer Schleife abzufragen.

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

Sie könnten dann diese Schleife erstellt verwenden einen verschachtelten Bericht:

 
var $currentMonth = ''; 

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

    //Display report detail for month here 
} 

* Hinweis: Ungeprüfte, aber Sie bekommen den allgemeinen Kern von ihm bin ich sicher.

1

Dies ist das SQL-Skript:

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

Ich hoffe, Sie wissen, wo Sie diesen Code setzen sollte: D

Verwandte Themen