2013-08-31 3 views
0

У меня есть структура проектов DB, ​​такая как (ID, projectName, projectDate (MySQL DATE) и т. Д.). Когда я делаю 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 

И, может быть, этот wil l работа также http://sqlfiddle.com/#!2/d11df/5