在mysql 8.0上出现“ group by desc”语法错误,在5.7上很好

时间:2018-12-19 07:17:10

标签: mysql sql mysql-5.7 mysql-8.0

该语句就像SELECT * FROM db.table group by id desc;

会引发类似错误

  

15:02:24 SELECT * FROM db.table按ID分组   desc LIMIT 0、10错误代码:1064。您的SQL错误   句法;检查与您的MySQL服务器版本相对应的手册   在第1行0.00014处使用在'desc LIMIT 0,10'附近的正确语法   秒

在Ubuntu 18.04 Desktop 64bit上的MySQL 8.0.13上

在Windows或CentOS或Ubuntu上的MySQL 5.7上会很好。

我基本上知道,select语句就像。

SELECT statement... [WHERE condition | GROUP BY `field_name(s)` HAVING condition] ORDER BY `field_name(s)` [ASC | DESC];

那么这5.7的问题不会发出错误吗?

还是SQL标准上更复杂的东西?

3 个答案:

答案 0 :(得分:1)

根据@ P.Salmon对问题的评论。

  

如果您在手册中查找select语句   http://dev.mysql.com/doc/refman/5.7/en/select.html您将看到   最多5.7 asc|descgroup by的可选修饰符   从8.0开始不再存在的语句,如果您查看   升级文件   https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-sql-changes   弃用记录在案。

由于这种情况,@ Linda Li的答案可能是一个不错的选择。

答案 1 :(得分:0)

此查询没有任何意义:

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

答案 2 :(得分:0)

我遇到了同样的问题,因此对于MySQL 8,我使用了类似的sql:

SELECT * FROM db.table 
group by id 
order by id desc