重新排序项目表的算法

时间:2015-12-21 22:19:17

标签: database drag-and-drop gridview-sorting

我有一个Web界面,列出了网格中任意数量的元素。我需要允许用户使用拖放操作对它们进行重新排序。

事情的UI方面很容易,但我很难想象在数据库上做什么 。以下是标准:

  • 从数据库表中提取元素
  • 除了id之外,每个元素都有一个名称和一个名为 sortOrder 的字段
  • 名称字段是唯一的
  • sortOrder 不是唯一的
  • 网格(默认情况下)首先按sortOrder排序,然后命名为。
  • (以下是使事情变得复杂的事情)用户可以手动编辑sortOrder值。他们可以使用重复值,或将其保留为默认值(这也会导致重复)
  • 我可以从拖放触发器中获取任何内容,包括行号,上一行和下一行号,实体本身,拖动实体的 sortOrder 或删除的位置上。让我们假设我有关于事件所需的每个数据点
  • 我想用尽可能少的查询来进行此操作

当然,我可以遍历整个表格,并自动为每个循环分配一个新的 sortOrder ,但我觉得应该有更好的优化方式

我所做的是:

  • 获取从新位置下一个元素的拖动元素和当前 sortOrder
  • sortOrder 元素设置为其新下一个邻居的元素。
  • 通过 sortOrder 1 为 sortOrder >> =已删除元素new sortOrder 的每个元素递增更新表格EM>

这在大多数情况下工作正常,但是当我使用相同的sortOrder将元素放在两个元素之间时,它会移动到第一个元素的顶部。不介于两者之间。很明显,我必须考虑其他一些变量。但是哪个?

实施例

让我们说网格看起来像那样:

|Id|Name |sO|
|--|-----|--|
| 1|Ape  | 7|
| 2|Bird |13|
| 3|Duck |13|
| 4|Gecko|13|
| 5|Fox  |14|

当我拖动Ape并将其放在GeckoFox之间时,我可以将其更新为 sortOrder 为14,然后{{1} }。

但是,当我拖动UPDATE SET sortOrder+=1 WHERE sortOrder>=14并将其放在ApeDuck

之间时,此方法无效

1 个答案:

答案 0 :(得分:0)

您正在处理两种排序顺序。一个是sO列中的数字。另一个是行出现时的顺序。你想维持后者,而不仅仅是前者。因此,在ID的给定sO值内跟踪顺序。如果任何下一行的sO与新行相同,那么您也会增加其order-within值。