2009-01-24 141 views
4

我想弄清楚一種讓用戶對記錄進行排序(等朋友列表)的方法。讓用戶對記錄進行排序?

我想給用戶,或者通過輸入數字(之間)移動的記錄(朋友)直行至列表的頂部或底部的機會。

開始我以爲只是增加了一個名爲SortOrder的(INT)列於表中所有用戶的朋友,並根據其訂購的記錄應顯示設置的號碼。

但我想避免的是,等用戶有400個朋友,如果他想設置好友號碼400在列表中的位置1,那麼我將不得不更新每一個記錄與一個新的排序。

所有數據都存儲在MS Sql數據庫中。

我希望有人對此有一個神奇的解決方案?

回答

3

使用浮點數爲排序列。

設置初始的項目,如0.0,1.0等等

移動到頂部,利用分鐘-1.0。移動到底部,設置爲最大值+1.0。在兩個項目之間移動,設置爲(上一個+下一個)/2.0

這與行號方法類似,但數字之間有更多「空間」。從理論上講,當兩個關聯值增長到結束時,仍然需要重新編號。我不知道這種情況在實際中會多快發生,但我預計這種情況很少發生,因此可以在任何維護任務中完成。


[編輯] FWIW,這個問題又回到了我幾次,所以here's a way that does roughly the same, but with strings

0

這聽起來像你正在尋找一個鏈表的類型結構,其中每個記錄將按順序保存下一個記錄的ID。

+0

聽起來像是正確的解決方案,除了將其存儲在關係數據庫中並基於鏈表結構對結果進行排序將非常困難且耗時。 – Karl 2009-01-30 23:05:41

0

我不知道魔法,但是對於移動到頂部或底部,您可以將SortOrder設置爲最小/最大(SortOrder)+/- 1。誰說頂部必須是1或0?

+0

這真的只處理移動到頂部或底部,而不是在中間某處。儘管如此,我還是沒有找到你,因爲它對於那些有限的情況很有幫助,特別是當你的初始SortOrder鍵處於允許範圍的中間時(例如對於有符號的32位int,說2^30)。 – paxdiablo 2009-01-24 11:58:42

0

下面是我該怎麼做:使用SortOrder列。據推測,會有一個初始的默認排序順序,按字母排序,因此每個人都會根據其字母順序被賦予SortOrder值。

然後,當用戶將某人移到頂端時,您可以將SortOrder設置爲最大值+1。如果他們將某人移到底部,那麼它將是min -1。如果他們把某人移到中間的某個地方,那麼你會想要計算他們正在移動的中間的哪一半。如果它是上半部分,那麼碰到他們之上的每個人的SortOrder。如果它是下半部分,那麼減少下面每個人的SortOrder。

不知道有這樣做的更快捷的方式...

+0

最糟糕的情況是將某人從最後一個朋友轉移到第二個最好的朋友,那麼您必須更改N-1個記錄。如果您希望最小化行更改,那麼有更好的方法。儘管如此,我還沒有找到你,因爲它有用。 – paxdiablo 2009-01-24 11:56:36

+0

在你的場景中,爲什麼不把最好的朋友的SortOrder加1,然後將你想要移動的朋友的SortOrder(最後的朋友)設置爲最好的朋友的SortOrder-1? – 2009-01-25 01:05:17

1

我無法想象他們會做這往往足以成爲一個真正的問題,但是,如果你擔心,使用的伎倆我們從過去的幾天開始使用BASIC代碼。

回來時,基本有行號,我們只需把它們編號爲10,20,30等,因此,如果我們需要插入10和20之間的一個,我們就稱它爲15.或者,如果20應已經到了10之前,我們將其重新編號爲5.

對於32位整數列,您可以擁有200,000個間隔爲100的朋友,綽綽有餘以移動事物,特別是如果您聰明的話。

您可能需要偶爾運行掃描作業重新編號朋友100,200,等(不大不小的磁盤碎片整理程序,爲您的社交網絡)。不要試圖通過查看朋友號碼來檢測這一點,使用另一個字段,當用戶重新安排他們的朋友並在進行碎片整理時將其清除時將其設置爲true。這將會更有效率。

0

你可以把它看作朋友組。

最初,每個人都在組0中,並且順序是按名稱或其他。(a)
- 如果用戶隨後將朋友(a)的「羣組」增加到1,則他們移動到頂部
-如果用戶然後將朋友(b)的「羣組」增加到1,則(a)和(b)出現在頂部
- 然後,如果用戶增加了「本集團」的朋友(b)再次,然後(b)出現第1和第(一)第二

只是thougt ...

相關問題