有这样一个需求,有一个列表,有一个操作顺序的选项,这个顺序操作是利用箭头排序的。
点击向上的箭头,顺序就升一个,点击向下的箭头,顺序就降一个。
具体的功能如下所示:
我本来想用时间和order两个字段来控制,点击向上,order+1,同时更新下排序时间。
在sql里就先按order,再按时间排序。
但我发现如果新建一个项目,初始的排序都是0的话,点击第一个条目向下时,就会使order变成-1,排到最后一位。
请教各位高手有没有什么更好的实现方法。
PS:有朋友说,点击一次箭头要重新更新一次所有的条目顺序,但这样效率太低了,我放弃这种方法。
补充:非常感谢各位的热情,各位说的基本上都是同一种可行的方法,(可惜只能采纳一个答案,不然我就都采纳了。)
总结下我的方法,我在插入数据的时候,使用id作为order,这样就确保order是唯一的字段。接下来就是和最接近的一行数据的order进行值的交换。
阿神2017-04-10 15:11:53
order字段插入数据时设置为当前时间,然后某条记录点上(下)的时候找order小于(大于)本条记录的第一条(差最小)的记录,交换他们的order值
这样无论列表多长,每次交换的成本都是 一句select where order < xx limit 1(索引)和两次update
黄舟2017-04-10 15:11:53
既然有了 order 字段并且按这个排序,更新时间就没有必要了。
点击 order = n 这一行后面的向上的剪头:
将 order = n 的 同 order = n - 1 的 order 值互换
点击 order = n 这一行后面的向下的剪头:
将 order = n 的 同 order = n + 1 的 order 值互换
PHPz2017-04-10 15:11:53
方法一:排序字段unique,升降时采用“就近替换”。这个的缺点是,插入记录若要指定跟随某行,会产生重排,最坏情况是全表,理想的只是插空。建议采用RAND获取unique值,这样可以产生空。此外重排的时候最好加上事物,防止多人操作产生奇怪的事情。
方法二:两个字段进行排序,允许排序字段重复,用额外字段来确定等值“排序字段”的排序。
方法三:排序字段是字符串XXXBBB,XXX是主序字段,BBB是辅助排序字段