Синтаксическая ошибка «group by desc» на mysql 8.0, которая подойдет на 5.7 - PullRequest
0 голосов
/ 19 декабря 2018

Оператор похож на SELECT * FROM db.table group by id desc;

Будет выдано сообщение об ошибке типа

15: 02: 24 SELECT * FROM db.table group по 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?

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

У меня такая же проблема, поэтому для MySQL 8 я использовал sql следующим образом:

SELECT * FROM db.table 
group by id 
order by id desc 
0 голосов
/ 04 марта 2019

Взяв из комментария @ 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#upgrade-sql-changes Это устаревание задокументировано.

С этой ситуации @LindaОтвет Ли может быть хорошим вариантом.

0 голосов
/ 19 декабря 2018

Этот запрос не имеет смысла:

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);
...