2010-08-26 154 views
2

http://www.bioshapebenefits.nl/bioshapebenefits/en/news/donations.html如何按月份+年份分組?

正如你所看到的,在這裏我有一個很長的條目列表,按日期排序,非常簡單。所以在mysql中,例如只有列'name'和'date'。如果我想用php來製作一個列表,這也將非常簡單,只需按日期排序即可。

但是我怎麼會把這幾個月+年放在兩者之間,如例子所示?像:

2010年6月

  • TRALA
  • 拉拉
  • 瓦剌
  • TRALA
  • 拉拉
  • 瓦剌

回答

4

在SQL Server就會像下面一樣簡單,我想像MySQL有類似的東西:

GROUP BY Year(Date), Month(Date)

+0

他們正在使用MySQL。 – RedFilter 2010-08-26 15:17:06

+1

該死!擊敗我42秒。據我所知,這是正確的。 – 2010-08-26 15:17:16

+0

@RedFilter,我試着在我的答案中提到 - 到目前爲止,我只看到了來自SQL Server/Oracle背景的mySQL。但通常在任何情況下,我都看過所有這三個核心功能似乎都非常接近。 – 2010-08-26 15:20:17

5

有十幾方法對皮膚這隻貓,但我方法很可能會是這樣(所有粗糙的代碼片段,也不是完全執行)

首先,查詢

select `name` 
    , month(`date`) as date_month 
    , year(`date`) as date_year 
    from [Table] 
order by `date` desc 

然後,組織數據到所需的邏輯組

$templateData = array(); 
foreach ($rows as $row) 
{ 
    $templateData[$row->date_year][$row->date_month][] = $row->name; 
} 

然後,在模板

<?php foreach ($templateData as $year => $months) : ?> 
    <?php foreach ($months as $month => $names) : ?> 
    <h2><?php echo $month, ' ', $year; ?></h2> 
    <ul> 
     <?php foreach ($names as $name) : ?> 
     <li><?php echo $name; ?></li> 
     <?php endforeach; ?> 
    </ul> 
    <?php endforeach; ?> 
<?php endforeach; ?> 
1

我們這樣做是本月分組的噸位。我使用這個表達式來截斷表示本月第一個時間戳的任意時間戳。

TIMESTAMP(DATE_FORMAT(action_time,'%Y-%m-01')) 

這做同樣的事情作爲Oracle主義TRUNC(action_time,'MM')

例如,你可以做

SELECT COUNT(*) NUM, TIMESTAMP(DATE_FORMAT(t.action_time,'%Y-%m-01')) MONTH 
FROM TABLE t 
GROUP BY TIMESTAMP(DATE_FORMAT(t.action_time,'%Y-%m-01')) 

這有概念的優勢在於它保持了一個月的截斷數據的timestampiness ,所以如果你需要的話,你仍然可以計算時間差異,如果你需要,還可以做其他時間和日期的事情。

正如ravern指出的,有一個小的性能損失(但它並不壞!)。我們的一些表格列使用這個函數加載,所以它們已經被截斷了一個月。