我有一个包含列(int id pkey, int group, double sortOrder)
的表,其中sortOrder在一个组中实现用户指定的排序顺序。在某些修改中,我需要重新编号组中所有项目的排序顺序。不同组中的SortOrder值彼此独立(即它们只在一组内进行比较)
SELECT id, sortOrder FROM tbl WHERE group=X ORDER BY SortOrder
以当前顺序给出该组中的所有元素,我必须将顺序值(1,2,3,...)分配给SortOrder。
问:有没有合理的方法 - 最好是可移植到其他SQL实现 - 这样做而不单独更新每一行?
更多信息:我正在使用双打,因为这允许在不修改其他项目的情况下轻松分配新的排序顺序(MIN-1表示之前,MIN + 1表示插入结束,(A + B)/ 2表示插入在A和B之间。) - 这当然受到双重分辨率的限制(在最坏的情况下约为52次插入)。我不确定这是否值得额外检查溢出,但无论如何我对任何其他数据类型都有同样的问题。
我想出的另一个想法是使用字符串和自定义COLLATE和ADD / SUB / AVG函数模拟无限分辨率。然而,这似乎非常不便携。
答案 0 :(得分:1)
我不相信SQLite有这么简单的方法。
你可能更好看的(如果真的是这个问题)是坚持整数排序并实现维持序列的算法。
例如,如果对排序的所有更改都涉及将项目向上/向下移动一个位置,则只需要交换两个值的排序顺序......
UPDATE table
SET sort_order = CASE WHEN sort_order = 3 THEN 4 ELSE 3 END
WHERE sort_order IN (3,4)
或者,如果您可以将项目移动到任何位置,请使用类似......
的内容UPDATE table
SET sort_order = CASE WHEN sort_order = @old THEN @new ELSE sort_order + 1
WHERE sort_order >= @new AND sort_order <= @old
我知道您说不每次都想要更新其他项目,但 实际证明在中非常有效我过去的大多数案例。