1.背景
在联通端,评论列表要按点赞数升序排序进行分页,假若点赞数相同按创建时间升序排序。(升序:值从大到小)
2.问题
往年列表须要按时间戳升序排序,由于13位时间戳的惟一性强,不容易重复,可以取列表最后一个item的时间戳进行
然而点赞数会出现相同的情况,例如有10个相等点赞数为5的数据,正好分页到中间第五个,怎么下一次分页的时侯拉取剩下五个点赞数为5的和大于5的数据点赞评论网站,防止拉到早已拉过的前五个数据呢?
3.解决方法
模仿时间戳分页。取最后一个item的点赞数(agreeCount)和创建时间戳(lastTime)。
数据排序规则为:先按点赞数升序排序,假若点赞数相同按创建时间升序排序。
伪sql:orderbyagreeCountdesc,createTimedesc.
第一页:不进行任何条件查询,直接按该次序查出指定的条数例如前20条:limit20。(怎样判定是否为第一页,可跟联通端约定如:第一页agreeCount传-1点赞评论网站,通过agreeCount==-1判定是否为第一页,切忌不可以传0进行标示,由于点赞数会有为0的情况)。
第二页:分两步查询,(取问题2的反例)
最后附上完整的伪代码:
int pageSize = 20;
List list = new ArrayList();
if (agreeCount == -1){
//第一页
list = (select * from t_ideas order by agreeCount desc,createTime desc limit pageSize);
} else {
//下一页
//拉取等于当前点赞数数据
List sameList = (
select * from t_ideas
where agreeCount = 5 and createTime < lastTime
order by agreeCount desc, createTime desc limit pageSize);
list.addAll(sameList);
if (sameList.size() < pageSize){
//拉取少于当前点赞数数据
int surplus = pageSize-sameList.size();
List surPlusList = (
select * from t_ideas
where agreeCount < 5
order by agreeCount desc, createTime desc limit surplus);
list.addAll(surPlusList);
}
}
return list;