我正在处理用户可以重新排列项目的内容,以后需要按所选顺序显示这些项目。举个简单的例子,考虑项目清单:
A,B,C,D,E,F,G MySQL表格很简单:user_id,letter,sortnumber
允许用户以增量步骤更改顺序。他们可能会将A移到D,G之后开始等。除此之外,他们还可以添加和删除项目。因此,他们可能会删除C或添加X.在每个步骤中,我都会将数据发送给PHP,PHP将处理它,并在MySQL中设置项目。
我认为有两种方法可以解决这个问题:
每次添加/删除/重新排序 什么,发送整个列表 PHP,删除他们的所有数据 以前在那里,只是 插入新列表。问题是, 这是很多 每次删除/插入 做任何事情。他们可能会将A移到B之后,然后突然我删除7条记录,然后再插入7条记录。从好的方面来说,这很简单。
他们所做的每一次“移动”(例如添加,删除或重新排序)都会为此发送信息。例如。他们在F之后移动了An,然后告诉我“在F之后移动”我现在必须检查列表中是否存在A和F,然后我必须减少A和F之间的所有“sortnumber”(包括F)。如果他们说“删除Z”,我必须在列表中找到它,删除它,然后减少它后面的所有记录数。
所以我只是好奇......有没有人必须处理秩序重要的事情,如果是的话,你是怎么做到的?
答案 0 :(得分:2)
将一个Sequence列添加到表中 - 作为浮点数。
在Row-A和Row-B之间移动项目时,将其序列号设置为相邻列的平均值
索引序列列:)
答案 1 :(得分:0)
当用户想要保存项目的新订单时,请将新订单与旧订单进行比较,并仅对已更改 sortnumber 的订单执行更新。如果他们删除了某个项目,则无需将 sortnumber 向下移动。如果您使用中间缺少的数字对列表进行排序,它仍将按正确的顺序排列。
答案 2 :(得分:0)
最后的序列顺序是唯一重要的顺序。如果您移动六个项目来获取特定订单,那么您并不需要关心列表的顺序在您开始时的状态与完成时的情况之间的关系。
添加和删除项目而不必担心顺序顺序,然后在单击“保存排序”按钮时更新项目以设置序列值。
这给你带来两个好处:
答案 3 :(得分:0)
为每个项目设置主键和分类号。如果你有一个包含主键的php数组,你可以使用array_splice()删除项目并将项目插入到数组中。
// base array
$items = array( 7, 11, 9, 4, 5);
// remove item 11
array_splice($items, array_search(11), 1);
// insert 11 before item 4
array_splice($items, array_search(4), 0, 11);
// input now contains 7, 9, 11, 4, 5
然后遍历数组并使用主键更新排序
$i = 0;
foreach($items as $item) {
// UPDATE item_table SET sorting = '$i' WHERE id = '$item';
i++;
}
答案 4 :(得分:0)
以下是我对Thomaschaaf提出的问题的答案:
这不是问题。如果你 具有较少的可排序性 元素,我会重置所有 他们的新秩序。
否则,似乎只需要 “测试和设定”的工作量或更多 仅修改具有的记录 改变。
您可以将此作品委托给 客户端。让客户维护 旧排序和新排序和 确定哪一行[sort-order] 应该更新 - 然后传递那些 PHP-mySQL接口的元组。
您可以在中增强此方法 以下方式(不要求 浮子):
如果列表中的所有可排序元素都初始化为排序顺序 根据他们在的位置 列表,设置每个的排序 元素之类的东西 row [sort-order] = row [sort-order * K] 其中K是某个数字>平均 您希望列表的次数 被重新安排。 O(N),N =数量 元素,但增加插入 容量至少为N * K至少 K在每个退出对之间打开槽 元素。
- 醇>
然后,如果你想在另外两个元素之间插入一个元素,那就是 简单地将其排序顺序更改为 是一个>较低的元素和 <上层。如果没有“房间” 你可以简单地在元素之间 重新应用“传播”算法(1) 在前一段中提出。 K越大,它越少 将适用。
K算法将是有选择的 应用在PHP脚本中的同时 选择新的排序顺序 由客户完成(Javascript, 也许)。
答案 5 :(得分:0)
只需添加其他列。称之为order
。
您拥有行的顺序,每行都有一个id或主键。只需一次浏览一行,然后按顺序设置顺序。所以:
UPDATE item_table SET order = 0 WHERE id="fred";
UPDATE item_table SET order = 1 WHERE id="larry";
UPDATE item_table SET order = 2 WHERE id="john";
UPDATE item_table SET order = 3 WHERE id="sydney";
我确信在数学上有一些诡计多端的方法,但有时简单的答案是最好的。
然后,当您进行查询时,请添加SORT BY order
。