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

网友投稿 692 2022-10-28

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

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

最近要查找MySQL不同城市及其对应最新的记录,遇到了​​distinct​​​、​​group by​​​和​​order by​​的坑。

表结构

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

数据

distinct

查询不同的城市:

查询不同城市及其对应的创建时间(​​create_at​​):

为什么出现了相同的城市?

distinct会把其之后的所有字段当作一个整体来去重,而不仅仅是紧跟其之后的字段。

这样就会导致表中所有记录都不一样,都会返回出来。

group by去重

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

为什么排序没用上?

原因是这样写是错误的,自动忽略了​​ORDER BY​​。

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

先查出每个分组最大的id,然后找到每个id对应的记录。

或者

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

实际测试13万条数据,前面用时0.3秒,后者用时近1分钟。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:muppet ORM是对jdbc进行封装的持久化框架
下一篇:Quarkus改造Pmml模型项目异常记录及解决处理
相关文章

 发表评论

暂时没有评论,来抢沙发吧~