2014-01-29 18 views
0

我需要实现一个用于视频提要的Web服务,并将其用于Android客户端。从远程服务中恢复的ListView和大型列表

顺便说一下,我的实现是一个方法getVideos(offset,quantity)与MySQL表返回查询结果SELECT * FROM videos ORDER BY id DESC LIMIT offset,quantity其中ID是一个自动增量值。

但是,因为它是一个非常活跃的饲料我发现以下错误情况:

数据库有视频1,2,3 ... 10。

Android客户端请求视频偏移量= 0,数量= 5,因此返回项目10,9,8,7,6。用户开始播放一些视频,同时发布5个新视频,所以现在该表格包含1,2,3 ... 15项。然后用户继续滚动,当用户到达列表末尾时,客户端尝试请求下一个bundle:offset = 5,quantity = 5,但是返回相同的项目,出现重复项(或者不添加任何内容)到列表显示。

如果这个问题最好的办法是什么?

回答

1

如果您不想重复数据,那么请不要使用OFFSET,而应使用id上的where子句。 检查什么是你给出的最后一个ID,然后运行像查询:

SELECT * FROM videos WHERE id<:last_id ORDER BY id DESC LIMIT 0,:quantity 

这不仅保证结果不会重复,而且it should actually be faster因为DB将不必计算所有行偏移。

UPDATE

如何获得ID列的最大值时,你的第一个查询,然后添加到WHERE,所有的结果都低于或等于原来的值?这样你就不会得到重复,除非你更新一些位置。更好的是,如果您向行添加修改时间列并使用第一个查询的时间。这样你不会显示编辑的行,但至少他们不会破坏订单。

SELECT * 
FROM videos 
WHERE mtime < :original_query_time 
ORDER BY id DESC 
LIMIT :offset, :quantitiy; 
+0

感谢您的回答Jakub,我忘记了提到服务结果不是必需的由id DESC命令。想象一下,例如一个“流行”的feed,以positive_votes/votes的顺序返回结果 – Addev

+0

@Addev已更新。如果这不起作用,那么你唯一的机会就是像SQL游标这样的东西,如果是这样的话,那么最好允许重复。 –