Группировать результаты SQL-запросов по годам - PullRequest
0 голосов
/ 26 октября 2018

Я новичок в 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'

Заранее спасибо за помощь:)

[EDIT]

Наконец-то я нашел способ сделать то, что хотел:

$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 голосов
/ 26 октября 2018

Это то, что вы захотите сделать в своем запросе, поскольку 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`

... в зависимости от того, какой выход вам нужен.

0 голосов
/ 26 октября 2018

Если вы хотите группировать данные по году.

    Select id,title,date,DATE_FORMAT(date, '%Y') YEAR_GRP from table group by YEAR_GRP
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...