我有一个包含任务的表,我想根据任务的优先级给出这些明确的排序。我能想到的唯一方法是通过一个唯一 int列来索引任务在优先级方面的位置(即1是前1000个是低)。
问题是,我想更新任务并将其优先级设置为较低的值,我必须更新其当前值和新值之间的所有其他行。
任何人都可以提出更好的实施方法吗?
答案 0 :(得分:7)
使用实数值作为优先级。您始终可以在两个现有值之间滑动值,例如newPri = task1Pri + (task2Pri - task1Pri)/2
,其中Task1具有较低优先级的数值(可能是较高的优先级)。
Corin指出,必须为插入优先级列表顶部或底部的任务计算最小和最大优先级。
joelhardi提醒我们,重新订购流程是不时清理桌面的好主意。
答案 1 :(得分:3)
不要像你说的那样创建一个带编号的列,而是创建一个名为parent的字段。每行包含其父项的pk。当你想要移动一个项目时,只需将其父pk更改为新的pk和在其父pk中引用它的项目。想想单链表。
答案 2 :(得分:1)
我最喜欢凯文的答案,但是如果你想要一个快速而肮脏的解决方案,那就按照你已经描述的方式进行,但不是增加1,而是增加10或100 ......如果你需要重新确定优先级,你在任务之间有一些摆动空间。
答案 3 :(得分:0)
我只会分配少量值(1..10),然后是ORDER BY Priority DESC,DateCreated ASC。 如果您需要为每个任务设置不同的优先级,则需要更新WHERE优先级> xxx就像你说的那样。
答案 4 :(得分:0)
如果没有两个任务可以具有相同的优先级,那么我认为这就是你必须要做的。但是,如果允许重复优先级,则可以使用优先级和datemodified列,并按两者排序以根据优先级和上次更新获得正确的顺序。