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|desc
是group 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 上很好的主要内容,如果未能解决你的问题,请参考以下文章