【问题标题】:MySQL 5.7 | group by | distinct | aggregation errorMySQL 5.7 |分组 |与众不同 |聚合错误
【发布时间】:2018-05-03 17:40:23
【问题描述】:

我使用的是 MySQL 5.7。

我有一张如下表:

--------------------------------------------------
| id | currentcy_id | rate |      created_at     |
--------------------|------|---------------------|
|  1 |      1       |   1  | 2017-11-07 23:19:48 |
|  2 |      2       |   2  | 2017-11-07 23:20:48 |
|  3 |      3       |   4  | 2017-11-07 23:21:48 |
|  4 |      1       |   2  | 2017-11-07 23:22:48 |
--------------------------------------------------

我正在尝试通过执行以下操作来获取每个不同 currency_id 的最新值:

SELECT `currentcy_id`, `rate`, MAX(`created_at`)  
FROM `currency_reates` 
GROUP BY (`currentcy_id`)

我也尝试了 DISTICT 功能:

SELECT DISTINCT(`currentcy_id`), `rate`, MAX(`created_at`)  
FROM `currency_reates`

我从两个关于聚合的查询中得到一个错误。

注意:我在 MySQL 中禁用了 STRICT 选项并且它可以工作,但我不想这样做,我想要正确的方式(新的方式)。

【问题讨论】:

  • rate 也需要聚合函数或者在group by
  • @LONG,根据created_at,我需要最后一个rate
  • 我明白了,那你可以试试:SELECT currentcy_id, MAX(rate) FROM currency_reates A GROUP BY (currentcy_id) WHERE created_at = (SELECT MAX(created_at ) FROM currency_reates as B WHERE B.currentcy_id = A.currentcy_id),这不是得到结果的最佳查询,但可能更容易理解
  • select * from currency_reates where id = (select id from currency_reates order by end_date desc limit 1);

标签: mysql group-by distinct aggregate-functions mysql-5.7


【解决方案1】:
SELECT C.`currentcy_id`, C.`rate`, C.`created_at`
FROM `currency_reates` C
JOIN ( SELECT `currentcy_id`,  MAX(`created_at`)  as m_date
       FROM `currency_reates` 
       GROUP BY (`currentcy_id`)
     ) as T
  ON C.`currentcy_id` = T.`currentcy_id`
 AND C.`created_at` = T.m_date

【讨论】:

  • 是的,这是最常用的方法。topicstarter 只需要知道组内是否有两个或多个(最大)时间戳相同(currentcy_id),此查询会将这些结果返回给.
  • 就是这样,但与旧的MySQL版本相比,它做的太多了。有什么解释他们为什么采用这种方法吗?
  • @CairoCoder 因为人们关心他们数据的完整性。
  • @JuanCarlosOropeza 他们有点困惑(或者,我很困惑)但基本上我认为他们只是在谈论 MySQL 决定默认启用严格模式。
  • @CairoCoder 因为没有启用 STRICT 模式,您可能会返回(最好的)不确定的或(最坏的)错误的结果。因此,例如,您的原始查询为每个 currentcy_id[sic] 返回一个任意(实际上是不确定的)速率
猜你喜欢
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多