找出最近不重复数据的sql写法

本文介绍如何使用SQL查询最近不重复的数据记录。通过在子查询中利用用户ID和最大投票时间,再结合主查询,可以筛选出最近的唯一用户活动记录。示例SQL语句展示了从table表中按用户ID分组,获取每个用户最新的记录,并按时间降序排列,最后限制返回结果的前10条。
摘要由CSDN通过智能技术生成
现在有个需求,要找出给某活动投票的前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

如果要查询出整条记录写法为:

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 进行排序 。

如果有错误或更好的建议,也欢迎交流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值