В мускуле есть режим 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?