Nasıl php ve mysql ile aylık raporları kırmaya?

4 Cevap php

Burada nispeten basit bir şey yapmaya çalışıyorum. Bir zaman damgası (: 2009-05-30 00:14:57 biçimi) ile işaretlenmiş temelde ben satır bir grup ile bir tablo var.

Ne yapmak olduğunu isteyen kulüpler bu yüzden böyle bir nihai sonuç ile sol kulüpler tüm satırları çeker ve aya göre bunları böler bir sorgu:

February
rowID name order date
rowID name order date
rowID name order date

January
rowID name order date
rowID name order date
rowID name order date

vb

Ben nasıl bunu yapmak için bir kaç belirsiz fikirleri var - onlar sadece uzun soluklu görünüyor.

Yollarından biri her ay için bir sorgu yapmak olacaktır. Ben ne cari ay PHP o zaman geri ay belirli bir sayıda gider () için bir yapı elde ediyorum.

gibi:

$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


     }

}

Bunu yapmak için daha iyi bir yolu var mı?

4 Cevap

Aswell yıl ile uğraşmak zorunda olduğunu unutmayın. Iki kayıtları, Ocak '09 tane ve Ocak '08 için bir tane varsa, sizin sonuçlar çarpık edilebilmektedir.

Svetlozar tavsiyesi takip ve bir kerede tüm verileri almak için iyi. Eğer bellekte var, bir şey faydali içine segment o PHP kullanımı:

$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>';
}

Bu ay sipariş, bir zamanlar tüm verileri almak daha iyidir ..

Sonra php ile getiriliyor ederken (örneğin $ curMonth için) bir değişken içinde geçerli ay saklayabilirsiniz ve ayda bir değişiklik ise, "Yeni Ay" echo ...

Bir sorgu yürütülürken bu db ile "konuşmaları" en aza indirmek için daha iyi, yavaş ..

Eğer tüm rapor almak için SQL sorgusu değiştirebilir. Bu çok daha verimli bir döngü veritabanı sorgulama daha.

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

Daha sonra iç içe geçmiş bir rapor oluşturduk için bu döngü kullanabilirsiniz:

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: denenmemiş, ama eminim bunun genel yüreğin olsun.

Bu SQL betik:

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

D: Ben bu kodu koymak gerekir nerede biliyor umut