【问题标题】:Solution for allowing user sorting in SQlite在 SQlite 中允许用户排序​​的解决方案
【发布时间】:2014-08-06 07:47:10
【问题描述】:

我所说的用户排序是指作为网站上的用户,您会看到一堆项目,并且您应该能够对它们重新排序(我使用的是 jQuery UI)。

用户在每个页面上只能看到 20 个项目,但项目的总数可能是数千个。

我假设我需要在表格中添加另一列以进行自定义排序。

如果用户看到 41-60 的项目,并且他将它们排序为:

41 = 第二 42 = 第一 43 = 第五 等等

我不能只将排序列设置为 2、1、5。 我需要遍历整个表格并更改每条记录。 有什么办法可以避免这种情况并以某种方式仅对当前选择进行排序?

【问题讨论】:

  • 澄清一下,您是否希望用户能够重新排列数据库内部的行?这个排序需要保存吗?您可能不想为此添加新列,因为这意味着您只能为访问该表的所有内容存储一个排序(因此,如果您有超过 1 个用户,则会遇到问题)。如果您只需要在 UI 端重新排序而不需要保存排序,则缓存 DB 查询结果并在客户端应用程序中进行管理。

标签: sql sqlite sorting


【解决方案1】:

按照您自己的建议,添加另一列来存储自定义订单。您可以通过使用REAL-typed 列来避免必须重新分配所有行的值的问题:对于新行,您仍然使用递增的整数序列作为列的值。但是如果用户重新排序一行,十进制数据类型将允许您使用公式½ (previous row's value + next row's value) 来更新被移动的单行的列。你 有两种特殊情况需要处理,即如果用户将一行移动到列表的开头或结尾。在这种情况下,只需使用min - 1 rsp。 max + 1.

这种方法是我能想到的最简单的方法,但它也有一些缺点。首先,由于数据类型只有双精度,它具有理论上的局限性。在有限数量的重新排序之后,这些值太接近以至于它们的平均值不能成为不同的数字。但这实际上只是您在实际应用中永远不应该达到的理论极限。此外,该列每行将使用 8 个字节的内存,这可能比您实际需要的要多得多。

如果您的应用程序可能会扩展到这 8 个字节很重要,或者您可能有用户过于急切地重新排序行,那么您应该坚持使用 INTEGER 列并使用常数的倍数作为默认值(例如100, 200, 300, ..)。您仍然使用上面的更新公式,但是当两个值变得太接近时,您重新分配所有值。通过将常数乘数调整为平均表大小/用户行为,您可以控制必须执行此昂贵操作的频率。

【讨论】:

    【解决方案2】:

    我可以想到几种方法来做到这一点。一种是使用 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

    【讨论】:

      【解决方案3】:

      我能想到的一种方法是:

      1. 添加一个新列(如果可行)或创建一个新表来保存项目的顺序。
      2. 在任何页面上,您都会根据初始订购显示大约 20 件商品。
      3. 使用 jquery 的Draggable 可以向该表发送更新

      【讨论】:

        【解决方案4】:

        我认为您可以通过一个额外的专栏来做到这一点。

        首先,您可以使用默认排序顺序预先填充这个新列,然后允许用户通过拖放 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
        

        如果子集是连续的,这也应该有效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-07-20
          • 1970-01-01
          • 2014-11-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-18
          • 2012-09-27
          • 1970-01-01
          相关资源
          最近更新 更多