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

Posted

技术标签:

【中文标题】mysql 8.0 上的“group by desc”语法错误,在 5.7 上很好【英文标题】:"group by desc" syntax error on mysql 8.0 which is fine on 5.7 【发布时间】:2019-05-19 15:42:59 【问题描述】:

声明就像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 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 标准上更复杂的东西?

【问题讨论】:

没有order by 子句,desc 没有意义。而且我怀疑这个查询在 5.7 版本中也应该失败 该错误表明缺少 order by 子句。 DESC 用于 order by,而不是 group by。 这应该被视为一个错误,但我怀疑它会 - 在旧版本的 MySQL 中,group by 子句响应(即允许)ASC/DESC,因此它被用作一种简写方式排序最终结果。见rextester.com/NJDD72740 如果您在手册dev.mysql.com/doc/refman/5.7/en/select.html 中查找 select 语句,您将看到高达 5.7 asc|desc 是 group by 语句的可选修饰符,从 8.0 开始不再存在。如果您查看升级文档dev.mysql.com/doc/refman/8.0/en/… 记录了此弃用。 @P.Salmon 您能否发表评论作为答案?所以我们可以将问题标记为已解决。 【参考方案1】:

这个查询没有意义:

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

【讨论】:

原始查询类似于 select id,min(col1) ... ,但我的意思是关于第二部分。 这是您个人的意见,“不完整分组”是不好的。实际上,这是一个很棒的功能,可以为开发人员节省大量时间。有据可查的是,MySQL 将从分组的行中选择一个随机值。因此,如果您知道所有值都是相同的,那么这是一个很好的捷径。其他不支持这个功能的数据库,让我们遇到这个问题就想跳出窗口。只是我个人的看法:这个特性应该在下一个 SQL 标准中。 @drfumanchu 。 . .有趣的是 MySQL 的设计者已经从 MySQL 8.0 中删除了这个特性(至少使用默认设置)。鉴于 SQL 的设计者也忽略了此功能,并且几乎没有其他数据库支持这种语法,您的意见似乎是少数意见。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

取自@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 的回答可能是一个不错的选择。

【讨论】:

以上是关于mysql 8.0 上的“group by desc”语法错误,在 5.7 上很好的主要内容,如果未能解决你的问题,请参考以下文章

架构运维篇:MySQL 8.0启用BinLog 支持

mysql 和 node.js 上的 AES 加密

mysql 8.0

MySQL 8.0 Docker使用注解

MySQL 5.7MySQL 8.0 yum 源

MySQL5.7升级到8.0过程详解