簡體   English   中英

按年份分組 SQL 查詢結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM