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

问题描述 投票:2回答:3

声明就像SELECT * FROM db.table group by id desc;

会引发错误

15:02:24 SELECT * FROM db.table group by id desc LIMIT 0,10错误代码:1064。您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册,以便在第1行0.00014秒的'desc LIMIT 0,10'附近使用正确的语法

在Ubuntu 18.04桌面64位的MySQL 8.0.13上

这对于Windows 5.7或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标准?

mysql sql mysql-5.7 mysql-8.0
3个回答
0
投票

我有同样的问题,所以对于MySQL 8,我使用了这样的sql:

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

1
投票

取自@ P.Salmon对该问题的评论。

如果查看手册http://dev.mysql.com/doc/refman/5.7/en/select.html中的select语句,您将看到最多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的回答可能是个不错的选择。


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);
© www.soinside.com 2019 - 2024. All rights reserved.