2012-08-30 36 views
1

我有一個存儲在數據庫中的項目列表。每個項目都有一個id列,一個標題和一個位置列(int)。如何讓用戶插入列表中的任何位置?

默認情況下,無論用戶何時向列表中添加新項目,其ID都會置於該位置。所以如果你有3個項目,ids 1,2,3,他們的位置也會是1,2,3。

然後當提取位置時,我會在我的SQL查詢中執行ORDER BY position ASC

問題是,用戶想要一個功能,他可以在現有項目的任何位置添加新項目。

因此,如果您的項目1,2,3位置1,2,3,他可以選擇在位置2添加一個新的項目,這將導致項目1,2,3,4,具有位置:1 3 4 2

所以第4項將在第2位,第2項和3將被下推至3和4位放,等

什麼是最簡單/最有效的algorith到完成這個插入?

+0

您可能需要閱讀[這](http://stackoverflow.com/questions/1581758/mysql-update-a-sorting-index-column-to -move-items),[this](http://stackoverflow.com/questions/2113005/updating-an-order-column-mysql)和[this](http://stackoverflow.com/questions/1995770/best三通對實現-重新排序的信息收集和堅持,這對數據庫/ 1995800#1995800)。 – Kermit

回答

3

從代碼的角度來看,最簡單的方法是使用鏈接列表樣式,其中有下一個元素ID,而不是訂單值。這在小列表中不太有用,但是當您開始增加列表大小時,它會使更新/移動/刪除更清晰,並防止更新數千個元組以更改1次訂單。

++我沒有手頭上有一個確切的代碼示例,但你會打個電話給用戶

SELECT Posts.id, Posts.next, Posts.content, User.firstPost FROM db.posts AS Posts 
JOIN db.user as User ON Posts.ownerid = User.id 
WHERE User.id='123' AND Posts.active = 1; 

這會得到一個用戶的所有職位均榜上有名的,而那麼你將有一個字段包含下一篇文章的ID。要開始,您需要一個鍵來識別第一篇文章(將第一篇文章的ID存儲在用戶的信息中)。在您拉第一篇文章後,您將抓取它的'下一個'值,並用它來識別下一篇文章。

對於一個簡短的列表來說,這似乎有點瘋狂,但考慮一個擁有1000個帖子的用戶。如果他們需要在第二位添加1個職位。在傳統的數字訂購系統中,您現在需要使用+1更新更新999個其他行。有了這個解決方案,如果您需要在第二個位置插入帖子,您只需查詢第一個帖子即可獲取下一個值。一旦你有了它,你可以將它改爲新的第二篇文章的值,並將第二篇文章的下一個值設置爲第一篇文章的原始版本。

[1st Post] --Next---> [2nd Post] --Next---> [3rd Post] 

後插入:

[1st Post] -.       .--> [2nd Post] --Next---> [3rd Post] 
      `--Next--> [New 2nd Post]--` 
+0

你可以發佈一些代碼來演示如何做到這一點? –

+0

請記住,像這樣使用鏈表會使從數據庫中讀取有序列表變得困難 - 你不能在sql中執行ORDER BY。您必須一次讀取一行,或者在應用程序中進行排序(這就是我會做的)。 –

+0

正確,您的應用程序將執行排序,但您仍然以相同的方式檢索所有相同的數據(請求給定用戶的所有元組)。通過計數或訂單索引,而不是通過ID索引。這使得數據庫中的搜索更快,當涉及到分頁時,您只需提供每個頁面上第一篇文章的ID。 – BayssMekanique

相關問題