Синтаксическая ошибка "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);
Другие вопросы по тегам