最近在做一些数据库的操作,对于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可以说也算慢了。
不知道博友们,你们有没有更好的方法呢?如果有可以告诉我啊,我们一起成长啊,如果有不对的地方也请大家指出。
转载请注明出处哦。