2010-01-10 39 views
0

我正在用幾個「單行程」構建一個網站。這些都是使用簡單的PHP5表單添加的,存儲在MySQL 5數據庫中。每行都有'id'(auto_increment),'title','description','status'(1或0)和'date_added'(MySQL日期時間)。使用PHP按周分組和顯示MySQL條目

我想顯示他們的月和年分組,像這樣:

<dl> 
    <dt>August 2009</dt> 
    <dd><strong>title 1</strong> - description 1</dd> 
    <dd><strong>title 2</strong> - description 2</dd> 
    <dd><strong>title 3</strong> - description 3</dd>   
    etc... 
</dl> 
    <dl> 
    <dt>July 2009</dt> 
    <dd><strong>title 1</strong> - description 1</dd> 
    <dd><strong>title 2</strong> - description 2</dd> 
    <dd><strong>title 3</strong> - description 3</dd>   
    etc... 
</dl> 

我發現了一個MySQL的片段,其按月表面上組行,但查詢只返回一對夫婦的結果,而不是全表:

SELECT `title`, `description`, `date_added` 
FROM one_liners WHERE `status`=1 GROUP BY MONTH(date_added) 

我將如何去分組他們,然後循環顯示如上?

任何幫助將不勝感激。

謝謝!

+0

要挑剔,使用嵌套的有序列表,而不是DL/DT語義善良;)這些都不是真正的定義。 – Parrots 2010-01-10 03:23:02

回答

2

您不希望爲此使用GROUP BY子句。雖然它聽起來像你想要的,但它具有完全不同的含義。

運行正常查詢:

SELECT `title`, `description`, `date_added` FROM one_liners 
WHERE `status`= 1 ORDER BY `date_added` 

然後循環的結果,做這樣的事情:

$query = 'SELECT `title`, `description`, `date_added` FROM one_liners WHERE `status`= 1 ORDER BY `date_added`'; 
$res = mysql_query($query); 
$month = null; 
$year = null; 

echo '<dl>'; 
while($row = mysql_fetch_assoc($res){ 
    $r_month = strtotime($row['date_added']); 
    if($month != date('m', $r_month) || $year != date('Y', $r_month)){ 
    echo '<dt>' . date('F Y', $r_month) . '</dt>'; 
    $month = date('m', $r_month); 
    $year = date('Y', $r_month); 
    } 
    echo '<dd><strong>' . htmlentities($row['title']) . '</strong> &mdash;' . htmlentities($row['description']) . '</dd>'; 
} 
echo '</dl>'; 

我特意選擇了只有一個dl使用,因爲一個dl應該持有多dddt元素,而不是每個列表一對。隨意根據需要調整我的代碼,如果你不同意:)

+0

這絕對是完美的*,非常感謝。 奇怪的是,我昨晚在牀上仔細研究過,發現我已經愚蠢地把它們放在兩個DL中 - 我知道我會接受它!工作的危險很晚。但是,謝謝你的出色解決方案。 *保存while語句後缺少的尾括號! – user247335 2010-01-10 10:37:41

1

我認爲你需要單獨在PHP中做這個。 SQL中的分組通常用於像SUM,AVG,MAX,MIN,COUNT等等。它對於實際記錄集沒有做任何事情來顯示某種您可以在PHP中訪問的分組。

我在這種情況下做了什麼是一個變量,用於跟蹤循環內部,以瞭解何時到達一個新組。爲了您的SQL你會做:

SELECT `title`, `description`, `date_added` 
FROM one_liners WHERE `status`=1 ORDER BY MONTH date_added DESC 

然後在PHP你會做:

$prevMonth = ''; 
while ($row = mysql_fetch_assoc($result)) { 
    $currMonth = $row['date_added']; 
    if ($currMonth != $prevMonth) { 
     if ($prevMonth != '') { 
      echo '</dl>'; 
     } 
     echo '<dl><dt>' . $currMonth . '</dt>'; 
     $prevMonth = $currMonth; 
    } 
    echo '<dd><strong>' . $row['title'] . '</strong>'; 
    echo ' - ' . $row['description'] . '</dd>'; 
} 
if (mysql_num_rows($result) > 0) { 
     echo '</dl>'; 
} 

這一切真的做起來,通過跟蹤該月的前一行,你循環。當你到達一個新的,它將關閉舊的DL並打開一個新的。

根據您在數據庫中存儲日期的方式(時間戳vs日期時間),您需要用適當的代碼替換$currMonth = $row['date_added'];以將其轉換爲「2009年8月」格式或任何您想要的格式。

0

你不想在那裏使用GROUP BY,請嘗試使用ORDER BY來代替。