我是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;
答案 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`
...取决于您所需的输出类型。