2011-12-01 137 views
0

我的數據庫表創建歸檔是一樣的東西:爲我的博客網站

id year month 
1  2011 november 
2  2011 november 
3  2011 october 

我需要創建一個查詢,以便它返回這樣的事情:

2011 
    november 
    november 
    october 

什麼是正確的查詢語法在PHP腳本中做到這一點?

這裏是我使用的代碼:

<?php 

$uid = $_SESSION['uid']; 
$sql = "SELECT year, GROUP_CONCAT(month) AS months FROM articles GROUP BY year"; 
$res = mysql_query ($sql) or die (mysql_error()); 
if (mysql_num_rows($res) > 0) { 
    while ($rows = mysql_fetch_assoc($res)) { 
     foreach ($rows AS $row) { 
      echo $row['year'] . "<br>"; 
      $months = explode(",", $row['months']); 
      foreach ($months AS $m) { 
       echo $m . "<br>"; 
      } 
     } 
    } 
} 
?> 
+0

這只是關於演示,所以你不應該在查詢中這麼做。 – zerkms

+0

我的意思是,我需要2011年顯示一次和月份列根據當年顯示,每次我嘗試,我2011年重複了3次。 – wfareed

+1

好吧,只是不輸出第二和第三行的「2011」:-S – zerkms

回答

2

您可以使用GROUP_CONCAT()返回一個逗號分隔個月的列表:

SELECT year, GROUP_CONCAT(month) AS months GROM tbl GROUP BY year 

Returns: 
2011 november,november,october 

或者只是選擇列和處理顯示/演示在您的代碼中:

SELECT year, month FROM tbl WHERE year = 2011 

Returns 
2011 november 
2011 november 
2011 october 

在代碼中,循環並只顯示當它ch安格斯。

更新由於代碼示例似乎有必要...

// Results from above GROUP_CONCAT() query already fetched & stored in `$rowset`:  
while ($row = mysql_fetch_assoc($res)) { 
    $rowset[] = $row; 
} 

// Now $rowset is a 2D array containing all rows. 
foreach ($rowset as $row) { 
    // Output the year 
    echo $row['year'] . "\n"; 

    // months are comma-separated via GROUP_CONCAT() 
    // explode them into an array 
    $months = explode(",", $row['months']); 
    foreach ($months as $m) { 
    // Output the months 
    echo $m . "\n"; 
    } 
} 
+0

我建議避免使用'group_concat',因爲它的長度限制爲'group_concat_max_len',即使你可能贏了沒有超過它,但對於'MySQL'中的新手來說可能有些棘手 – Nemoden

+0

我只需要顯示一年並顯示今年的所有月份! – wfareed

+0

@wfareed我明白這一點。它必須在PHP中完成,而不是在你的查詢中完成。 –

0

如果我理解正確你的問題,我認爲,一個簡單的「ORDER BY」子句會做的伎倆對你來說,類似於:

SELECT * FROM table_name ORDER BY year DESC 

然後,使用腳本語言來顯示數據,一個好主意,可能是(也許)來獲取第一行的一年,它循環存儲在一個時間變量,然後通過行和檢查如果有的話,那一年會發生變化s,改變上述變量的值,如下所示:

$current_year = $data_set[0]['year']; 
foreach ($data_set as $data_row) 
{ 
    $current_year = ($data_row['year'] != $current_year) ? $data_row['year'] : $current_year; 
    //Do something with it and/or the rest of the data 
} 

希望這對您有所幫助。

乾杯。