【问题标题】:MySQL group by desc -how to explain this sql: SELECT ts,avg_time FROM xx WHERE ip="MAX" GROUP BY id DESC LIMIT 300?MySQL group by desc - 如何解释这个 sql:SELECT ts,avg_time FROM xx WHERE ip="MAX" GROUP BY id DESC LIMIT 300?
【发布时间】:2017-05-18 06:24:12
【问题描述】:

表格是这样的:

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

似乎错了,但它运行... 我的问题:

  1. 选择列不在 sum、count 等聚合函数中
  2. 按 id desc 分组是什么?

【问题讨论】:

  • 为什么错了?
  • 谁告诉你错了?
  • 用适当的数据样本更新您的问题..请预期结果
  • 数据很多但并不重要。我的意思是,在我看来,它应该因语法错误而无法运行。但我错了。 auto_increment 列在 group by 中是特殊的吗?
  • 阅读 only_full_group_by dev.mysql.com/doc/refman/5.7/en/sql-mode.html,从 mysql 5.7.5 开始,默认情况下这是真的,但在此之前 mysql 允许松散的 group by。

标签: mysql sql group-by


【解决方案1】:

查询有点笨。

  1. 它选择所有 ip = 'MAX' 的记录(是的,单引号应该用于字符串文字)。
  2. 它按 ID 对结果进行分组,这不会改变任何内容,因为这是主键。
  3. 它将结果限制为 300 个任意行,因为没有 ORDER BY 子句。 (在旧版本中,GROUP BY 保证在 MySQL 中也可以排序,这就是为什么 DESC 关键字被允许用于 GROUP BY,否则没有任何意义。所以这可能曾经有效,现在应该请改为阅读GROUP BY id ORDER BY id DESC LIMIT 300。)
  4. 它显示了非聚合的 tsavg_time,但是,正如前面提到的,在这个查询中无论如何都不会发生聚合。

也许这只是一个错字,GROUP BY id 本来应该是ORDER BY id,这将使查询完全有效(但在 MySQL 中有效的非标准引号除外)。

【讨论】:

    猜你喜欢
    • 2013-09-20
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多