工作需求:查询每个手机号的最近时间的信息记录,数据库mysql
抽象一下就是按某字段分组,每组倒序或正序,只取一条记录
表结构大致如下
表名:Mob
id(自增) | mobile | createtime |
---|---|---|
1 | 123 | 2018-10-25 13:13:25 |
2 | 123 | 2018-10-23 00:00:00 |
3 | 223 | 2019-01-01 23:59:59 |
最开始的思路就是先对表中的数据进行一次按时间排序,接着再对手机号进行group by,会默认取第一行,这不就是最近时间的数据了吗?
然后就开始愉快的写
SELECT * FROM (SELECT * FROM Mob ORDER BY createtime DESC) t GROUP BY mobile ORDER BY createtime DESC
结果无效。。。问题就出在,别人的mysql的group by都很聪明的取第一条,我的mysql 就跟 傻 X一样,我行我素,这个方法对我来讲失败了,可能别人会有效果吧。 不过子查询效率不高,容易形成慢sql,有待商榷
最后用内连接做了出来,主要依靠的还是表中的自增字段:id,真是功臣!
SELECT m1.id, m1.mobile, m1.createtime
FROM Mob m1 LEFT JOIN Mob m2
ON (m1.mobile = m2.mobile AND m1.id < m2.id)
WHERE m2.id IS NULL
ORDER BY createtime DESC
至此问题解决了,效率也要比子查询快一些
如果大佬有更好的方法,欢迎留言教教我,谢谢!
网友评论