表格就像:

CREATE TABLE `api_stats` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `ip` varchar(30) DEFAULT NULL,
 `app_name` varchar(50) DEFAULT NULL,
 `api_name` varchar(100) DEFAULT NULL,
 `avg_time` float(10,5) DEFAULT NULL,
 `ok` int(10) DEFAULT NULL,
 `err` int(10) DEFAULT NULL,
 `ts` bigint(20) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6741231 DEFAULT CHARSET=latin1


这个奇怪的SQL是:

SELECT ts,avg_time FROM api_stats WHERE ip="MAX" GROUP BY id DESC LIMIT 300


似乎错了,但是可以运行...
我的问题:


选择列不在汇总函数中,例如求和,计数
按ID desc分组是什么?

最佳答案

查询有点笨。


它选择ip ='MAX'的所有记录(是的,字符串文字应使用单引号)。
它将每个ID的结果分组,因为这是主键,所以不会做任何更改。
由于没有ORDER BY子句,它将结果限制为300个任意行。 (在较早的版本中,确保GROUP BY也可以在MySQL中排序,这就是为什么DESC允许GROUP BY关键字的原因,否则这将毫无意义。因此,这可能一次有效,并且现在应该如此阅读GROUP BY id ORDER BY id DESC LIMIT 300代替。)
它显示了未聚合的tsavg_time,但是,正如前面提到的,此查询中始终没有发生聚合。


也许这只是一个错字,而GROUP BY id实际上是ORDER BY id,这将使查询完全有效(但是,除了在MySQL中有效的非标准引号之外)。

关于mysql - MySQL按desc分组-如何解释此sql:SELECT ts,avg_time FROM xx WHERE ip =“MAX” GROUP ID ID DESC LIMIT 300?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44040085/

10-11 03:27
查看更多