Синтаксическая ошибка "group by desc" на mysql 8.0, которая подойдет на 5.7
Утверждение как SELECT * FROM db.table group by id desc;
Поднимет ошибку вроде
15:02:24 SELECT * FROM группы db.table по id desc LIMIT 0, 10 Код ошибки: 1064. У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, для правильного синтаксиса, чтобы использовать около 'desc LIMIT 0, 10' в строке 1 0,00014 сек.
на MySQL 8.0.13 в Ubuntu 18.04 Desktop 64bit
что было бы хорошо на MySQL 5.7 в Windows или CentOS или Ubuntu.
Я знаю, в основном, отборное утверждение, как.
SELECT statement... [WHERE condition | GROUP BY `field_name(s)` HAVING condition] ORDER BY `field_name(s)` [ASC | DESC];
Так проблема этого 5.7 не выдать ошибку?
Или что-то более сложное в стандарте SQL?
1 ответ
У меня та же проблема, поэтому для MySQL 8 я использовал sql следующим образом:
SELECT * FROM db.table
group by id
order by id desc
Принимая от @P.Salmon комментарий к вопросу.
Если вы посмотрите инструкцию выбора в руководстве http://dev.mysql.com/doc/refman/5.7/en/select.html вы увидите, что до 5.7
asc|desc
являются необязательными модификаторами дляgroup by
заявление, которого больше нет в 8.0.и если вы посмотрите документацию по обновлению https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html Это осуждение задокументировано.
Начиная с этой ситуации, ответ @Linda Li мог бы быть хорошим вариантом.
Этот запрос не имеет смысла:
SELECT *
FROM db.table
GROUP BY id DESC;
Вы делаете запрос агрегации. Итак (предположительно), таблица имеет несколько строк в id
, Они сгущаются до одного ряда. Какие значения следует использовать для других столбцов? Печально, что MySQL когда-либо поддерживал этот синтаксис. Итак, долгожданное изменение заключается в том, что ONLY_FULL_GROUP_BY
теперь по умолчанию.
Небольшой намек на то, что использование запроса агрегации без функций агрегирования является подозрительным.
Возможно, вы хотите:
select id, min(col1), min(col2), . . .
from t
group by id;
Или, более вероятно, вы хотите конкретную строку, такую как "самая ранняя" или "самая последняя", что-то вроде:
select t.*
from t
where t.createdAt = (select min(t2.createdAt) from t t2 where t2.id = t.id);