PHP/MySQL 重新排序菜单,在表中设置位置


PHP/MySQL Reorder Menu with Position set in table

在MySQL中,我有一个包含名称,id,位置和内容值的表。通过按 id 查询,内容以 php 格式加载到页面上。位置在 php 中用于创建一个动态菜单,菜单项按位置值升序。

例如,假设有 3 行,每行的位置值为 1、2 或 3。我正在尝试构建一个表单,以允许用户更改菜单、项目的位置或添加新的菜单、项目。因此,如果位置 3 中的行要更改为位置值 1,则 2 需要变为 3,1 需要变为 2。或者,如果添加了新项目,则其所占据的位置及其下方的所有位置都需要向上移动一个值。

解决这个问题的最佳方法是什么?任何建议将不胜感激。

如果您添加新项目,请更新position值等于或大于的所有项目:

UPDATE MenuItems SET position = position + 1 WHERE position >= newItemPosition;

如果您正在更新 - 仅更新位置高于更高项目位置的项目(它们只会切换位置)。

UPDATE MenuItems SET position = position - 1 WHERE position = higherItemPosition;

如果 newItemPosition 更新为较低的值,我会这样做:

UPDATE MenuItems SET position = position + 1 WHERE position = lowerItemPosition;

我想到了两个想法:

将菜单作为 AJAX 加载的div,然后对更改做出反应并重新加载div,这意味着您可以重新运行 SQL

将答案加载到 JavaScript 数组中并以这种方式呈现它们,因为您随后具有拖动更改功能。

在用查询蜂拥而至的数据库之前,创建覆盖位置字段的索引(例如主键),每次更改使用索引条目更新几行,等等,让我们考虑以下几点:

  1. 在最坏的情况下,菜单需要多长时间?
  2. 您是否真的需要从菜单中获取单个行,或者每当您需要显示菜单时,您需要选择其所有行?

大多数情况下,这些情况可以通过更简单、更实用的方法来解决,这对程序员来说也会容易得多。如果菜单不会太长,并且每次需要阅读它时都可能需要所有菜单,为什么不将其保留为程序中的列表(任何类型的项目),并使用任何方法(例如JSON或Python Pickle)对其进行序列化,然后再将其作为带有文本字段的单行存储在数据库中?如果菜单在列表中,则对其元素重新排序将非常简单,菜单的读取操作需要对数据库进行单行 SELECT,而写入操作将需要单个 UPDATE,而无需关心保持 Position 字段更新。