特定供应商的产品排序顺序存储在表格中。
例如:
ITEM_ID SORT_ORDER
100 1
101 2
105 3
106 4
108 5
依旧......
现在,如果供应商希望在他的网页上显示第一个产品(100),他可以在他的网页上显示第一个产品(100),为了显示他想要的结果,我们需要在表格中更改排序值,如下所示。
所有项目的新排序顺序值都会更新,新表格的格式如下:
ITEM_ID SORT_ORDER
100 5
101 1
105 2
106 3
108 4
依旧......
据观察,为了改变1个产品的排序顺序,我们必须为该特定供应商更新该表的所有行。 这是一项昂贵的工作。
我们正在寻找这个问题的解决方案,该解决方案使该供应商的产品的排序顺序保持最优化和最优化。成本效益的方法。
以任何其他方式维护排序顺序的任何替代解决方案
答案 0 :(得分:2)
据观察,为了改变1个产品的排序顺序,我们必须为该特定供应商更新该表的所有行。这是一项昂贵的工作。
嗯,是的,您需要更新所有行,但是,只需两步即可完成。在纯SQL中使用两个UPDATE语句。
测试用例:
SQL> CREATE TABLE t
2 (ITEM_ID int, SORT_ORDER int);
Table created.
SQL>
SQL> INSERT ALL
2 INTO t (ITEM_ID, SORT_ORDER)
3 VALUES (100, 1)
4 INTO t (ITEM_ID, SORT_ORDER)
5 VALUES (101, 2)
6 INTO t (ITEM_ID, SORT_ORDER)
7 VALUES (105, 3)
8 INTO t (ITEM_ID, SORT_ORDER)
9 VALUES (106, 4)
10 INTO t (ITEM_ID, SORT_ORDER)
11 VALUES (108, 5)
12 SELECT * FROM dual;
5 rows created.
SQL>
SQL> COMMIT;
Commit complete.
SQL>
现在,第一次更新是 ITEM_ID 100
将其设置为 SORT_ORDER 5
:
SQL> UPDATE t SET sort_order = 5 WHERE item_id = 100;
1 row updated.
SQL> SELECT * FROM t;
ITEM_ID SORT_ORDER
---------- ----------
100 5
101 2
105 3
106 4
108 5
SQL>
现在,第二次更新适用于所有 other ITEM_IDs
,将其设置为 SORT_ORDER -1
:
SQL> UPDATE t SET sort_order = sort_order - 1
2 WHERE item_id <> 100;
4 rows updated.
SQL>
SQL> SELECT * FROM t;
ITEM_ID SORT_ORDER
---------- ----------
100 5
101 1
105 2
106 3
108 4
SQL>
因此,只需两个更新语句即可完成任务。
更新根据Jeffrey的评论,可以使用 CASE 语句在单个更新语句中完成。
例如,
UPDATE t
SET sort_order = CASE item_id
WHEN 100 THEN 5
ELSE sort_order - 1
END;
如果sort_order
列上有任何唯一约束,那么与我之前使用两个更新语句的演示相比,这种方法更好。
答案 1 :(得分:1)
更好的解决方案是给出它们之间有很大差异的值,然后我们只需要更新一个值 例如
ID SORT_ORDER
100 500
102 1000
103 1500
104 2000
如果我们改变订单,我们只需要更新一行
ID SORT_ORDER
104 250
100 500
102 1000
103 1500
但我们需要跟踪有效操作可以执行的次数,如果找不到更多可能性,则需要重置数据。
答案 2 :(得分:0)
据观察,为了更改1个产品的排序顺序,我们必须为该特定供应商更新此表的所有行。这是一项代价高昂的练习。
您可以对前端进程中的所有项进行排序,并按排序顺序排列所有逗号分隔的ITEM_ID
,并将其保存在数据库中(使用Primary Key
)在单个UPDATE
语句中。