2009-08-19 36 views
2

我想在這裏做一些比較簡單的事情。基本上我有一個表中有一堆行標記了時間戳(格式:2009-05-30 00:14:57)。如何用php和mysql按月分解報告?

什麼,我想是這樣做是翻出所有行的查詢,並按月分裂他們,所以我留下了像最終結果:


ROWID名順序日期
ROWID名訂購日期
ROWID名訂購日期


ROWID名訂購日期
ROWID名訂購日期
行1 d名訂單日期

我有一些模糊的想法如何做到這一點 - 他們似乎只是長篇大論。

其中一種方法是對每個月進行查詢。我會推導出當前的PHP是什麼,然後構造一個for(),它會返回一定數量的月份。

喜歡:

$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 


    } 

} 

有沒有更好的方式來做到這一點?

回答

3

不要忘記,你必須藏漢處理年。如果你有兩個記錄,一個是09年1月份,另一個是08年1月份,你的結果可能會出現偏差。

最好遵循Svetlozar的建議並一次獲取所有數據。一旦你在內存中,使用PHP將其分割成一些有用的東西:

$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

最好是一次獲取所有的數據,按月訂購..

然後同時用PHP獲取您可以在當月存儲在一個變量(例如$ curMonth),如果沒有在一個月的變化,你回聲「新的月份」 ......

執行查詢速度慢,最好是用分貝減少你的「對話」 ..

+1

你可以給我一個例子嗎? – SamotnyPocitac 2014-05-06 14:35:56

1

您可以更改您的SQL查詢以獲取您的整個報告。這比在循環中查詢數據庫更有效率。

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

然後,您可以用這個循環來創建一個嵌套的報告:

 
var $currentMonth = ''; 

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

    //Display report detail for month here 
} 

*注意:未經檢驗的,但你得到它的一般要點我敢肯定。

1

這是SQL腳本:

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

我希望你知道你應該把這個代碼:d