查找MySQL不同城市及其对应最新的记录(解决distinct group by order by的坑)

最近要查找MySQL不同城市及其对应最新的记录,遇到了distinctgroup byorder by的坑。

表结构

查找MySQL不同城市及其对应最新的记录(解决distinct group by order by的坑)_第1张图片

CREATE TABLE `weather` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `weather` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `city` (`city`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

表数据

查找MySQL不同城市及其对应最新的记录(解决distinct group by order by的坑)_第2张图片

distinct

查询不同的城市:
查找MySQL不同城市及其对应最新的记录(解决distinct group by order by的坑)_第3张图片
查询不同城市及其对应的创建时间(create_at):
查找MySQL不同城市及其对应最新的记录(解决distinct group by order by的坑)_第4张图片
为什么出现了相同的城市?
distinct会把其之后的所有字段当作一个整体来去重,而不仅仅是紧跟其之后的字段。
这样就会导致表中所有记录都不一样,都会返回出来。
详情参考https://blog.csdn.net/lilongsy/article/details/90713906

group by去重

注意:MySQL5.7+版本不能是only_full_group_by SQL模式,新版本可能故意不然这样用了。

查找MySQL不同城市及其对应最新的记录(解决distinct group by order by的坑)_第5张图片
为什么排序没用上?
原因是这样写是错误的,自动忽略了ORDER BY
详情参见:https://lilongsy.blog.csdn.net/article/details/102836802

SELECT * FROM weather WHERE id IN (SELECT max(id) FROM weather GROUP BY city);

查找MySQL不同城市及其对应最新的记录(解决distinct group by order by的坑)_第6张图片
先查出每个分组最大的id,然后找到每个id对应的记录。

或者

SELECT * FROM weather a WHERE id = (SELECT max(id) FROM weather b WHERE a.city=b.city);

查找MySQL不同城市及其对应最新的记录(解决distinct group by order by的坑)_第7张图片

查找MySQL不同城市及其对应最新的记录(解决distinct group by order by的坑)_第8张图片
实际测试13万条数据,前面用时0.3秒,后者用时近1分钟。

你可能感兴趣的:(mysql)