现在有个需求,要找出给某活动投票的前10个人,按照投票时间从新到旧排序。而每个活动每人可以多次投票。
项目中应该经常碰到这种问题,像我这种小菜鸟,经常的做法是分两条sql,或嵌套查询,或查询后用程序二次处理。
我试着找出更简单的写法,现分享出来。
突然想到这和在淘宝等网购平台的 ‘最近有n人也浏览了该商品’ 功能类似哇。如果仅认为它走数据库,那是否也如出此辙呢。
切入正题,拿投票来举例,模拟些数据:
用户ID 投票时间
1 2001
2 2002
3 2003
1 2004
2 2005
按照项目要求,最终得到的数据应是:
用户ID 投票时间
2 2005
1 2004
3 2003
最先想到这两种写法:
1. select distinct 用户ID from table
2. select 用户ID from table group by '用户ID'
后来把第2条sql加工一下,最终sql为:
SELECT 用户ID,max(投票时间) time FROM table group by 用户ID order by time DESC limit 10
max(投票时间) 将会在 group by 子结果集下挑出一个最大时间的数据作为分组后的结果
然而要按时间从新到旧,order by 必须依据max(投票时间)的新字段 time 进行排序 。
如果有错误或更好的建议,也欢迎交流。
项目中应该经常碰到这种问题,像我这种小菜鸟,经常的做法是分两条sql,或嵌套查询,或查询后用程序二次处理。
我试着找出更简单的写法,现分享出来。
突然想到这和在淘宝等网购平台的 ‘最近有n人也浏览了该商品’ 功能类似哇。如果仅认为它走数据库,那是否也如出此辙呢。
切入正题,拿投票来举例,模拟些数据:
用户ID 投票时间
1 2001
2 2002
3 2003
1 2004
2 2005
按照项目要求,最终得到的数据应是:
用户ID 投票时间
2 2005
1 2004
3 2003
最先想到这两种写法:
1. select distinct 用户ID from table
2. select 用户ID from table group by '用户ID'
后来把第2条sql加工一下,最终sql为:
SELECT 用户ID,max(投票时间) time FROM table group by 用户ID order by time DESC limit 10
如果要查询出整条记录写法为:
SELECT * FROM table where (用户ID,time) in (SELECT 用户ID,max(投票时间) time FROM table group by 用户ID) order by time DESC limit 10
max(投票时间) 将会在 group by 子结果集下挑出一个最大时间的数据作为分组后的结果
然而要按时间从新到旧,order by 必须依据max(投票时间)的新字段 time 进行排序 。
如果有错误或更好的建议,也欢迎交流。