Непонятки с 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?
  • Вопрос задан
  • 21955 просмотров
Решения вопроса 1
@rakeev
Если нужны просто все имена без повторений, то SELECT DISTINCT name FROM dates
Если нужна еще и дата, то нужно явно указывать какая именно. Например SELECT MAX(date), name FROM dates GROUP BY name
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы