2013-08-31 17 views
0

我有一個數據庫項目結構像(ID,projectName,projectDate(MySQL日期)等)。當我做SQL查詢:我的輸出按年組

SELECT * FROM projects ORDER BY year(projectDate) DESC 

結果是:

2012 Project 1 
2012 Project 2 
2011 Project 3 

我需要集體項目在今年這樣的:

2012: 
Project 1 
Project 2 
2011: 
Project 3 

如何,我可以任何一年做沒有很多SQL的查詢?我使用Smarty進行模板輸出。

回答

0
SELECT * FROM projects GROUP BY year(projectDate) ORDER BY year(projectDate) DESC 

ORDER BY改變項目返回的順序。

GROUP BY將根據指定的列彙總記錄,使您可以在非分組列(例如SUM,COUNT,AVG等)上執行聚合函數。

+0

小心與GROUP BY和ORDER BY在這種情況下,同樣的查詢它的作品..但這並不總是給你你認爲的結果http://sqlfiddle.com/#!2/d3924/ 1這是一個經典的思考錯誤 –

0

我不認爲你可以做你想做的事。您的樣本輸出中似乎需要五行,其中兩個包含「年」值,另外三個包含「項目」值。

這些列有不同的數量和類型。

SQL查詢的輸出包含一個集合,其中所有行都具有相同的列。儘管可以將所有值連接成一個列,但在應用程序中更好。

如果你只是在這種格式想要的項目名稱,你可以通過做得到它:

select ProjectName 
from (SELECT ProjectName, year(projectDate) as y, 1 as ordering 
     FROM projects 
     union all 
     SELECT distinct year(projectDate), year(projectDate), 0 
     FROM projects 
    ) p 
order by y, ordering; 
+0

備註:小心所有在具有大表的MySQL服務器上的聯合,它可能會觸發基於磁盤的臨時表,由於基於磁盤的IO讀取和寫入對ORDER BY是必需的聲明。 –

0

這應該是做

select 
    year(projectDate) year 
, GROUP_CONCAT(projectName) 
from 
projects 
group by 
year(projectDate) desc 

看到http://sqlfiddle.com/#!2/d11df/3 而爆炸的最好方式在PHP和通過你的數據smarty

select 
    year(projectDate) year 
, GROUP_CONCAT(projectName SEPARATOR '<br />') as projectName_string 
from 
projects 
group by 
year(projectDate) desc 

也許這是l的工作也http://sqlfiddle.com/#!2/d11df/5