Задать вопрос
@rinaz22

Как группировать данные, если у них есть уникальные id?

В БД есть записи с уникальными id. Хочу группировать их по столбцу off_id(они могут быть одинаковые), но выходит ошибка:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'db.off_stat.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Насколько я понял это из-за того, что у каждой записи есть свой уникальный id.
Как это можно исправить?
  • Вопрос задан
  • 238 просмотров
Подписаться 1 Простой 1 комментарий
Решения вопроса 3
@Akina
Сетевой и системный админ, SQL-программист.
Вы пытаетесь сделать откровенную глупость, выводя значение id в итоговом наборе.

Вот есть некая группа, в ней все off_id одинаковы, но id различны. После группировки все эти записи будут сгруппированы в одну. А теперь, внимание, вопрос: ну и какое одно значение id из всех возможных сервер должен вернуть? не знаете? так ведь и сервер не знает... вот он и генерирует ошибку.

Уберите id из выходного набора. Либо явно и чётко скажите серверу, какое именно значение из всех возможных в группе он должен вернуть. Наименьшее? требуйте MIN(id). Наибольшее? MAX(id). Хоть какое, любое? ANY_VALUE(id).
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В режиме only_full_group_by MySQL ведёт себя так, как предписано стандартом.
https://dev.mysql.com/doc/refman/8.0/en/group-by-h...
Это означает, что при группировке в выбираемых полях SELECT'а должны быть только поля, входящие в GROUP BY или агрегатные функции от других полей.
Вернуть старое поведение, не соответствующее стандарту SQL, можно убрав only_full_group_by из параметра sql_mode, либо используя агрегатную функцию ANY_VALUE() для полей, не входящих в GROUP BY. Но гораздо лучше переписать запрос так, чтобы он соответствовал стандарту.
Ответ написан
Комментировать
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
Это не из-за того, "что у каждой записи есть свой уникальный id", а из-за того, что вы один набор данных (строки в таблице) превращаете в другой (аггрегированные данные), но при этом хотите выбрать ещё и поля из первого набора. Но чтобы это сделать, нужно эти поля тоже конвертировать. Для этого используются аггрегирующие функции: GROUP_CONCAT(), MIN(), AVG() и т.п.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы