2014-01-29 47 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遊標這樣的東西,如果是這樣的話,那麼最好允許重複。 –