通过用户排序我的意思是,作为网站上的用户,您会看到一堆项目,并且您应该能够重新排序它们(我正在使用jQuery UI)。
用户每个页面只能看到20个项目,但项目总数可以是数千个。
我假设我需要在表格中添加另一列以进行自定义排序。
如果用户看到41-60的项目,并且他将它们排序为:
41 =第二名 42 = 1 43 =第五 等
我不能将排序列设置为2,1,5。 我需要浏览整个表并更改每条记录。 有没有办法避免这种情况,并以某种方式只对当前选择进行排序?
答案 0 :(得分:1)
添加另一列以存储自定义订单,就像您自己建议的那样。您可以避免使用REAL
类型列重新分配所有行的值的问题:对于新行,您仍然使用增加的整数序列作为列的值。但是,如果用户重新排序行,则十进制数据类型将允许您使用公式½ (previous row's value + next row's value)
来更新已移动的单行的列。您
有两个特殊情况需要处理,即如果用户将一行移动到列表的开头或结尾。在这种情况下,只需使用min - 1
rsp。 max + 1
。
这种方法是我能想到的最简单的方法,但它也有一些缺点。首先,由于数据类型只具有双精度,因此它具有理论上的局限性。在有限数量的重新排序之后,这些值太靠近在一起,因为它们的平均值是不同的数字。但这实际上只是你在实际应用中永远无法达到的理论极限。此外,该列每行将使用8个字节的内存,这可能比实际需要的多得多。
如果您的应用程序可能扩展到这8个字节很重要的位置,或者您的用户可能会过度重新排序行,那么您应该坚持使用INTEGER
列并使用常数的倍数作为默认值(例如100, 200, 300, ..
)。您仍然使用上面的更新公式,但只要两个值变得太近,就会重新分配所有值。通过将常数乘数调整为平均表大小/用户行为,您可以控制必须执行此昂贵操作的频率。
答案 1 :(得分: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
答案 2 :(得分:1)
我能想到的一种方式是:
答案 3 :(得分: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
如果子集连续,这也应该有用。