搜索

首页  >  问答  >  正文

php实现箭头上下排序

有这样一个需求,有一个列表,有一个操作顺序的选项,这个顺序操作是利用箭头排序的。
点击向上的箭头,顺序就升一个,点击向下的箭头,顺序就降一个。
具体的功能如下所示:

我本来想用时间和order两个字段来控制,点击向上,order+1,同时更新下排序时间。
在sql里就先按order,再按时间排序。
但我发现如果新建一个项目,初始的排序都是0的话,点击第一个条目向下时,就会使order变成-1,排到最后一位。

请教各位高手有没有什么更好的实现方法。

PS:有朋友说,点击一次箭头要重新更新一次所有的条目顺序,但这样效率太低了,我放弃这种方法。
补充:非常感谢各位的热情,各位说的基本上都是同一种可行的方法,(可惜只能采纳一个答案,不然我就都采纳了。)
总结下我的方法,我在插入数据的时候,使用id作为order,这样就确保order是唯一的字段。接下来就是和最接近的一行数据的order进行值的交换。

迷茫迷茫2820 天前512

全部回复(5)我来回复

  • 阿神

    阿神2017-04-10 15:11:53

    order字段插入数据时设置为当前时间,然后某条记录点上(下)的时候找order小于(大于)本条记录的第一条(差最小)的记录,交换他们的order值

    这样无论列表多长,每次交换的成本都是 一句select where order < xx limit 1(索引)和两次update

    回复
    0
  • 黄舟

    黄舟2017-04-10 15:11:53

    既然有了 order 字段并且按这个排序,更新时间就没有必要了。

    点击 order = n 这一行后面的向上的剪头:

    将 order = n 的 同 order = n - 1 的 order 值互换

    点击 order = n 这一行后面的向下的剪头:

    将 order = n 的 同 order = n + 1 的 order 值互换

    回复
    0
  • PHPz

    PHPz2017-04-10 15:11:53

    方法一:排序字段unique,升降时采用“就近替换”。这个的缺点是,插入记录若要指定跟随某行,会产生重排,最坏情况是全表,理想的只是插空。建议采用RAND获取unique值,这样可以产生空。此外重排的时候最好加上事物,防止多人操作产生奇怪的事情。
    方法二:两个字段进行排序,允许排序字段重复,用额外字段来确定等值“排序字段”的排序。
    方法三:排序字段是字符串XXXBBB,XXX是主序字段,BBB是辅助排序字段

    回复
    0
  • PHP中文网

    PHP中文网2017-04-10 15:11:53

    PHP配合JQUERY来做吧,交互方面会优化很多,比如使用JQUERY排序后,AJAX 传回给PHP,PHP计算排序或交换排序

    回复
    0
  • 巴扎黑

    巴扎黑2017-04-10 15:11:53

    吐槽个:什么年代了,还用上下箭头排序,果断应该用js来搞拖动排序

    回复
    0
  • 取消回复