[英]Group SQL query results by year
我是 SQL 新手,我需要按年份對查詢結果進行分組。
換句話說,我有這個表結構: id | title | date
id | title | date
我當前的查詢SELECT * FROM table
我目前的結果:
array =>
0 =>
array =>
...
'date' => string '2018-03-09'
1 =>
array =>
...
'date' => string '2018-03-15'
2 =>
array =>
...
'date' => string '2017-03-15'
我需要這樣的東西:
array =>
0 =>
array =>
...
'date' => string '2018-03-09'
array =>
...
'date' => string '2018-03-15'
1 =>
array =>
...
'date' => string '2017-03-15'
預先感謝您的幫助:)
[編輯]
我終於找到了一種方法來做我想做的事:
$result = $sql->query("SELECT * FROM abstract ORDER BY date DESC");
$array = [];
forEach($result as $res) {
$year = strtok($res['date'], '-');
if (!isset($array[$year]))
$array[$year][0] = $res;
else
array_push($array[$year], $res);
}
return $array;
如果您想按年份對數據進行分組。
Select id,title,date,DATE_FORMAT(date, '%Y') YEAR_GRP from table group by YEAR_GRP
這是您希望在查詢中執行的操作,因為 MySQL 可以比 PHP 更有效地執行此操作。
這樣做的方法是在您的查詢中添加一個GROUP BY
子句,這將根據分組值將結果集中的行批處理為單行,在您的情況下為YEAR(date)
,如您所見按每行日期中的年份組件對項目進行分組。
因為您仍然希望返回所有結果,只是按每個不同的分組值分組,所以您需要使用聚合函數將所有匹配的行組合成一個值數組。 幸運的是,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`
...取決於您需要什么樣的輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.