Непонятки с sql_mode=ONLY_FULL_GROUP_BY

В мускуле есть режим ONLY_FULL_GROUP_BY, который заставляет сервер понимать только те запросы с GROUP BY, в которых для группировки указываются все неагрегирующие поля, указанные в SELECT согласно стандарту SQL. И ладно, когда у меня есть запрос на связку таблиц, где я могу в GROUP BY поместить названия колонок c функциональной зависимостью на ключи. Поместил туда GROUP BY 1,2,3,4,5,6..X и забыл. А что делать с запросами, где я должен сделать группировку по полю всего одной таблицы?

Итак, есть таблица `dates`, свидания.
id   name            date
1    Жанна Фриске    2013-12-12
2    Жанна Фриске    2013-12-13
3    Вера Брежнева   2013-12-14

Теперь педалим два одинаковых запроса. Один с пустым sql_mode, второй с ONLY_FULL_GROUP_BY:
SET @@sql_mode = "";
SELECT * FROM dates GROUP BY name;

SET @@sql_mode = "ONLY_FULL_GROUP_BY";
SELECT * FROM dates GROUP BY name;

В первом случае ожидаемый результат (мне неважно, что для Жанны выбралась запись с id=1, а не 2):
id   name            date
1    Жанна Фриске    2013-12-12
3    Вера Брежнева   2013-12-14

А во втором — ошибка. SQL error 1055 dates.id is not in GROUP BY. Что логично, потому что id неявным образом присутствует в SELECT'е. Ок, я добавлю в GROUP BY все имена колонок, что есть в SELECT. Но тогда в ответе сервер мне вернет все строки из таблицы, что тоже логично, но мне нафиг не надо, так как группировки по имени так и не произошло. И порядок названий полей тут не играет роли. Вот здесь у меня и возникает вопрос к общественности. Что мне делать в случае с такой простой группировкой при выборке из одной таблицы? Как составить запрос по выборке группированых по имени данных из одной таблицы, чтобы он работал при разных sql_mode?
  • Вопрос задан
  • 22613 просмотров
Решения вопроса 1
@rakeev
Если нужны просто все имена без повторений, то SELECT DISTINCT name FROM dates
Если нужна еще и дата, то нужно явно указывать какая именно. Например SELECT MAX(date), name FROM dates GROUP BY name
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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