查询最近一条记录

最近在做一些数据库的操作,对于Mysql 取最后一条记录犯了难,查阅了许多资料得不到答案,查看了下面两位的做法,我尝试了下发现了有错误的地方。下面是这

https://www.cnblogs.com/wwyz/p/6641895.html   标记1

https://blog.csdn.net/ariczhou/article/details/48808417 标记2

先说下标记1 中的上中下三策  首先下策是可行的

下策——查询出结果后将时间排序后取第一条

select * froma
where time<="2017-03-29 19:30:36"
order by time desc
limit 1

但是如作者说的,只能取一条记录,非常的不方便

那中策呢?,他是这么写的

中策——查询排序后group by

select * from ( select * from a
    where time<="2017-03-2919:30:36"
    order by time desc
)   group byuser_id

这么 写看起来是没错的,但是真的是这样吗?让我们来试验下 ,我是用如下sql 语句 ,想要取数据库中最大时间的记录

SELECT*FROM if_account_recored1  as a

WHERE a.ACCOUNT_ID =7 ORDER BYa.create_time   desc


可见最大时间是2017-01-19 日的数据,然后运行如下sql

SELECT * from

(SELECT*FROM if_account_recored1  as a WHEREa.ACCOUNT_ID =7 ORDER BY a.create_time   desc)as b

GROUP BY b.ACCOUNT_ID

查询结如下:


可见结果并不正确 ,正序排序也得到了相同的结果。所以说这么写是错误的。

关于上策它是这么写的:

上策——将max() 方法和group by结合使用

select *,max(time) from awhere time<="2017-03-29 19:30:36" group byuser_id

这样写真的对么? 我们拭目以待:我的SQL是这样的

SELECT b.*,MAX(b.create_time)

from if_account_recored1 as b

WHERE b.ACCOUNT_ID =7 GROUP BY b.ACCOUNT_ID

查询到的结果如下:

可见最大的时间是对的,但是前面这些数据是什么鬼,可见完全不对啊,标记2 的和标记1 的差不多,都是 同样的错误,但这也给我提供了思路,我可不可以先把最大的时间和用户的ACCOUNT_ID 查出来,然后再连接查询呢?说干就干,下面是SQL

SELECT a.* from if_account_recored1 as a ,(

                                           SELECT b.ACCOUNT_ID,MAX(b.create_time) as create_time

                                                 from if_account_recored1  as b

                                                 WHERE b.ACCOUNT_ID=7 GROUP BY b.ACCOUNT_ID

                                          ) as c

           WHEREa.ACCOUNT_ID=c.ACCOUNT_ID and a.create_time=c.create_time ORDER BY a.ACCOUNT_ID

查询结果是:

可以看见得到的完全正确,有些人说,这也只能查出 一条啊,其实很简单,只需要把WHERE b.ACCOUNT_ID=7去掉就可以了

sql 如下:

SELECT a.* from if_account_recored1 as a ,(

                                           SELECT b.ACCOUNT_ID,MAX(b.create_time) as create_time

                                                 from if_account_recored1  as b

                                                 GROUP BY b.ACCOUNT_ID

                                          ) as c

           WHEREa.ACCOUNT_ID=c.ACCOUNT_ID and a.create_time=c.create_time ORDER BY a.ACCOUNT_ID

查询结果如下:


我这个表一共有一千七百万多数据,而且是在SELECT a.*的情况下,才用了40.949s可以说也算慢了。

不知道博友们,你们有没有更好的方法呢?如果有可以告诉我啊,我们一起成长啊,如果有不对的地方也请大家指出。

转载请注明出处哦。

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值