http://www.bioshapebenefits.nl/bioshapebenefits/en/news/donations.html如何按月份+年份分組?
正如你所看到的,在這裏我有一個很長的條目列表,按日期排序,非常簡單。所以在mysql中,例如只有列'name'和'date'。如果我想用php來製作一個列表,這也將非常簡單,只需按日期排序即可。
但是我怎麼會把這幾個月+年放在兩者之間,如例子所示?像:
2010年6月
- TRALA
- 拉拉
- 瓦剌
- TRALA
- 拉拉
- 瓦剌
http://www.bioshapebenefits.nl/bioshapebenefits/en/news/donations.html如何按月份+年份分組?
正如你所看到的,在這裏我有一個很長的條目列表,按日期排序,非常簡單。所以在mysql中,例如只有列'name'和'date'。如果我想用php來製作一個列表,這也將非常簡單,只需按日期排序即可。
但是我怎麼會把這幾個月+年放在兩者之間,如例子所示?像:
2010年6月
在SQL Server就會像下面一樣簡單,我想像MySQL有類似的東西:
GROUP BY Year(Date), Month(Date)
有十幾方法對皮膚這隻貓,但我方法很可能會是這樣(所有粗糙的代碼片段,也不是完全執行)
首先,查詢
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; ?>
我們這樣做是本月分組的噸位。我使用這個表達式來截斷表示本月第一個時間戳的任意時間戳。
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指出的,有一個小的性能損失(但它並不壞!)。我們的一些表格列使用這個函數加載,所以它們已經被截斷了一個月。
他們正在使用MySQL。 – RedFilter 2010-08-26 15:17:06
該死!擊敗我42秒。據我所知,這是正確的。 – 2010-08-26 15:17:16
@RedFilter,我試着在我的答案中提到 - 到目前爲止,我只看到了來自SQL Server/Oracle背景的mySQL。但通常在任何情況下,我都看過所有這三個核心功能似乎都非常接近。 – 2010-08-26 15:20:17