声明就像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 8,我使用了这样的sql:
SELECT * FROM db.table
group by id
order by id desc
取自@ P.Salmon对该问题的评论。
如果查看手册http://dev.mysql.com/doc/refman/5.7/en/select.html中的select语句,您将看到最多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的回答可能是个不错的选择。
这个查询毫无意义:
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);