Это то, что вы захотите сделать в своем запросе, поскольку MySQL может сделать это гораздо эффективнее, чем PHP.
Способ сделать это - добавить к вашему запросу GROUP BY
предложение , которое объединит строки в вашем наборе результатов в одну строку на основе значения группировки, которое в вашемcase будет YEAR(date)
, поскольку вы хотите сгруппировать элементы по компоненту года в дате каждой строки.
Поскольку вы все еще хотите получить все результаты, простосгруппированные по каждому отдельному значению группировки, вам нужно использовать Aggregate Function , чтобы объединить все совпадающие строки в массив значений.К счастью, в MySQL есть функция с именем json_objectagg
, которая делает именно то, что вам нужно.
Таким образом, вы получите запрос, который выглядит примерно так:
SELECT year(`date`) AS `year`, json_objectagg(id, `date`, title) AS `line`
FROM abstract
GROUP BY `year`
Вместо json_objectagg
альтернативными являются, например, json_arrayagg
SELECT year(`date`) AS `year`, json_arrayagg(id, `date`, title) AS `line`
... или group_concat
SELECT year(`date`) AS `year`, group_concat(id, `date`, title) AS `line`
... в зависимости от того, какой выход вам нужен.