比如:
userid date money
1 '2015-6-30' 500
2 '2015-7-30' 100
2 '2015-8-30' 100
1 '2015-5-30' 500
3 '2015-8-30' 900
2 '2015-9-30' 100
1 '2015-3-30' 400
使用聚合函数 MAX(date) 得到最晚的时间.
但是如果要获取userid和money的话就需要分组,不然数据会不准确(这点我测过),但是会出现多条数据.
如何才能得所有不同的userid最晚的这条记录,得到这样的:
userid date money
1 '2015-6-30' 500
2 '2015-9-30' 100
3 '2015-8-30' 900
理论上来说,你这个需求是不合理的(或是不完全的)
你可能是想得到:
最后一天的userid和money。那最后一天可能会有多个userid和money?
这样的方案就是:
select userid, date, money
from your_table_name
where date = (select max(date) from your_table_name)
如果你的数据中,每一天只会有一个userid和money,其实这样出来就是一条数据了。
你的需求也可能是,找出当天最后一笔。。。你的date只是日期吗?是否包含了时间?如果没有时间,表中是否有其它字段可以反映先后顺序的?假设你的date中是有时间的。。。那么,找出最后一笔(通常,量不是很大的情况下,时间一般不会相同),就不需要聚合函数,只要用排序就好了。
--for mysql
select userid, `date`, `money`
from your_table_name
order by `date` desc
limit 1
--for ms sql server,碰到语法错误可能会是字段与关键字重复,可以加上[]
select top 1 userid, [date], [money]
from your_table_name
order by [date] desc
--其它数据库限制结果集的方法可以自己baidu
其实这样还是有问题。。。如果你的date只包括日期,每天又有多笔,而你又真的只想显示一笔。比如这样的数据:
userid date money
1 '2015-1-1' 330.00
2 '2015-1-1' 660.00
依这样的数据,你用方法2出来的可能是随机的一条,除非你加上order by userid...碰到同一userid同一天有多条,无解了。
所以,这时候,你需要考虑修改你的表结构。比如增加一个序号字段,可以是数据库的自增、或是按日期+流水号。
先这些吧。期待你把你的问题再补充一下。
SELECT * FROM (
SELECT * FROM money m ORDER BY m.`date` DESC
) t GROUP BY t.userid
我测试通过
mysql> select a.* from (select max(date) dates ,userid,money from moneys group by userid
,money) b,moneys a where a.userid=b.userid and a.money=b.money and a.date=b.dates;