按年份对SQL查询结果进行分组

时间:2018-10-26 12:53:15

标签: php sql mysqli

我是SQL的新手,我需要按年份对查询结果进行分组。

换句话说,我有这个表结构: 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;

2 个答案:

答案 0 :(得分:0)

如果要按年份分组数据。

    Select id,title,date,DATE_FORMAT(date, '%Y') YEAR_GRP from table group by YEAR_GRP

答案 1 :(得分:0)

这是您要在查询中执行的操作,因为MySQL比PHP更有效。

执行此操作的方法是向查询中添加GROUP BY clause,这将根据分组值将结果集中的行批处理为单行(在您的情况下为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`

...取决于您所需的输出类型。