【问题标题】:User-based row order in a SQL tableSQL 表中基于用户的行顺序
【发布时间】:2015-07-29 16:47:22
【问题描述】:

用户应该能够以类似 Excel 的方式更改行顺序。现在行按id 排序。所以我添加了另一列order

示例

1) Row A
2) Row B
3) Row C
4) Row D

现在Row A 应该在Row B 之后。

2) Row B
X) Row A
3) Row C
4) Row D

我需要计算新订单。因此我需要更新所有行!我不喜欢那样。

想法

我可以使用10 的十进制间隔来代替1

10.00) Row A
20.00) Row B
30.00) Row C
40.00) Row D

然后我可以这样计算新订单:neworder = before + (after - before) / 2

Row ARow B 之后

20.00) Row B
25.00) Row A
30.00) Row C
40.00) Row D

... 和Row C 之后的Row B

20.00) Row B
22.50) Row C
25.00) Row A
40.00) Row D

...和Row D 之后的Row C

20.00) Row B
22.50) Row C
23.75) Row D
25.00) Row A

有没有更好的方法来处理这类问题?

编辑 @Adam 建议使用单链线性列表。它会完成这项工作。但是排序和性能呢?

【问题讨论】:

    标签: postgresql linked-list sql-order-by


    【解决方案1】:

    如果您将“订单”列更改为“上一列”记录,则每次重新排序只需编辑两行。使用你的最后一个例子:(我给第一行的令牌值'NULL'。)

    B 行后 A 行

    NULL) Row B
    B) Row A
    A) Row C
    C) Row D
    

    ...和B行之后的C行(将A行更改为C,将C行更改为B)

    NULL) Row B
    B) Row C
    C) Row A
    A) Row D
    

    ...和 ​​C 行之后的 D 行(将 D 行更改为 C,A 行更改为 D)

    NULL) Row B
    B) Row C
    C) Row D
    D) Row A
    

    【讨论】:

    • 单链线性列表可以完成这项工作。但是排序和性能呢?
    • 一个基本的链表会给你订购能力。可维护性会比您上面描述的要好。如果你想最大化性能,肯定有更好的算法和结构,这取决于你想做多少工作;只需对列表数据结构进行一些研究。
    • 当然有订单,但我需要对所有行进行递归选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多