我想显示一个项目表,用户可以在其中添加、删除和重新排序项目。我想在MySQL DB中存储这些项的第一种方法是在表中有一个顺序列,但这似乎效率很低,因为当用户删除一个项时,我需要更新以下所有项的顺序。若我只是使用带id的ORDERBY或其他什么,我不知道如何让用户根据自己的意愿重新排序项目。你认为处理这个问题的最佳方法是什么?
我使用的堆栈:React JS->节点JS/Express->MySQL
我看到的一种方法是有一个sperate列,它说明它后面的项目的ID。然后,在您的查询中,当选择使其按该顺序显示时,您可以从该列进行排序。
这意味着,如果你删除了一个字段,你只需要更新它后面的字段,然后说明它在你刚刚删除的字段前面的字段后面(这是一个单词跳跃…(
这有帮助吗?
您肯定需要一个新列来执行此排序。它需要存储更多的信息,而不仅仅是物品ID、名称等等。
我已经用你提到的那种order
专栏成功地做到了这一点。以下是我使用的一些技巧。
-
不要担心删除一行时会发生什么。如果您的
order
列的值有差距,那么一切都会很好。 -
对
order
列使用与自动递增id
列相同的数据类型(可能是BIGINT UNSIGNED
(,但允许NULL值。 -
使用
ORDER BY COALESCE(order, id * 1000), id
,这样就可以使用id
值对从未设置过顺序的新插入行进行排序。新的一排排在最后。足够直观的默认行为。 -
要将id为
a
的项目放在id为b
的项目之后,请将行a
中的order
值更新为COALESCE(b.order, id * 1000) + 1
。
像这个
id name order COALESCE(order, id*1000)
1 orange NULL 1000
2 banana NULL 2000
3 apple NULL 3000
4 fig NULL 4000
这将使您的订单值为1000、2000、3000、4000,依此类推。要在第二个项目之后订购第四个项目,您将其order
设置为2001。像这个
id name order COALESCE(order, id*1000)
1 orange NULL 1000
2 banana NULL 2000
4 fig 2001 2001
3 apple NULL 3000
如果您进行了足够多的重新排序,在任何给定的项之后插入了1000多个项,那么您就必须通过为整个表重写order
列来清理它。如果您有一些相同的order
值,也没关系。我建议的ORDER BY
子句将保持它们的原始ID顺序。