2014-06-16 36 views
0

通過用戶排序我的意思是,作爲網站上的用戶,您會看到一堆項目,並且您應該可以對它們重新排序(我正在使用jQuery UI)。允許用戶在SQlite中排序的解決方案

用戶在每個頁面上只能看到20個項目,但項目總數可能是數千個。

我假設我需要在表格中添加另一列用於自定義排序。

如果用戶看到項目從41-60,並和他進行排序他們像:

41 =第2 42 = 1 43 =第五 等

我不能只設置排序列爲2,1,5。 我需要瀏覽整個表格並更改每條記錄。 有什麼辦法可以避免這種情況,並以某種方式只排序當前選擇?

+1

試試這個:http://www.kryogenix.org/code/browser/sorttable/ –

+0

爲了澄清,你想讓用戶能夠重新排列INSIDE數據庫中的行嗎?這個訂單是否需要保存?您可能不想爲此添加新列,因爲這意味着您只能存儲訪問該表的所有內容的一個排序(因此,如果您擁有多個用戶,則存在問題)。如果您只需要在UI端重新排序並不需要保存排序,則可以緩存數據庫查詢結果並在客戶端應用程序中對其進行管理。 – pje

回答

1

添加另一列來存儲自定義訂單,就像您自己建議的一樣。您可以通過使用REAL-type列來避免必須重新分配所有行值的問題:對於新行,您仍然使用遞增的整數序列作爲列值。但是,如果用戶重新排序一行,十進制數據類型將允許您使用公式½ (previous row's value + next row's value)來更新移動的單個行的列。您有 有兩個特殊情況需要照顧,即如果用戶將一行移動到列表的開頭或結尾。在這種情況下,只需使用min - 1 rsp。 max + 1

這種方法是我能想到的最簡單的方法,但它也有一些缺點。首先,由於數據類型僅具有雙精度,因此具有理論上的侷限性。經過有限數量的重新排序後,這些值太靠近,因爲它們的平均值是不同的數字。但這實際上只是一個理論上的限制,你在實際應用中永遠無法達到。此外,該列將使用每行8個字節的內存,這可能比您實際需要的多得多。

如果您的應用程序可能會擴展到這8個字節事或者你可能有overeagerly重新排序行的用戶,則應該堅持一個常數作爲默認值的INTEGER列和使用倍數點(如100, 200, 300, .. )。您仍然使用上面的更新公式,但是隻要兩個值過於靠近,就會重新分配所有值。通過調整平均表格大小/用戶行爲的常數倍數,您可以控制這種昂貴操作的執行頻率。

1

有幾種方法我可以考慮這樣做。一種方法是使用SELECT FROM SELECT樣式語句。就像這樣。

SELECT * 
FROM (
    SELECT col1, col2, col3... 
    FROM ... 
    WHERE ... 
    LIMIT n,m 
) as Table_A 
ORDER BY ... 

第二個選擇是使用臨時表,例如:

INSERT INTO temp_table_A SELECT ... FROM ... WHERE ... LIMIT n,m; 
SELECT * FROM temp_table_A ORDER BY ... 

另一種選擇看將是jQuery插件就像我能想到的DataTables

1

一種方法是:

  1. 添加一個新列(如果可行)或創建一個新表來保存項目的順序。
  2. 在任何頁面上,您將根據初始順序顯示約20項。
  3. 使用jQuery的Draggable您可以將更新發送到該表
1

我認爲你可以用一個額外的列做到這一點。

首先,您可以使用默認排序順序預填充此新列,然後允許用戶通過拖放jquery-ui來交互式修改它。

可以說這個用戶在表中有100個項目。您將順序欄中的值設置爲[1,2,3,...,99,100]。我建議你在原始表上運行一個腳本,將所有項目設置爲默認的排序順序。

現在回到你的例子中,用戶被展示41-60項:在瀏覽器中的初始演示文稿將按照[41,42,43,...,59,60]的順序排列。您可能還需要保存此子集中出現的最低順序(在本例中爲41)。或者更好的是,保存整個排名列表並按新順序還原完全相同的數字。這涵蓋了他們選擇一組尚未連續排列的記錄的情況,可能是因爲它們屬於其他人。

爲了演示我的意思:當他們在頁面中對它們進行重新排序時,您的javascript會將這些相同的數字重新分配給新順序中的子集。就像這樣:

item A : 41 
item B : 45 
item C : 46 
item D : 47 
item E : 51 
item F : 54 
item G : 57 

那麼用戶他們改變這個順序,但重新分配的數字是這樣的:

item D : 41 
item F : 45 
item E : 46 
item A : 47 
item C : 51 
item B : 54 
item G : 57 

如果子集連續這應該也行。

相關問題