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

时间:2012-06-06 06:19:23

标签: php mysql dynamic menu position

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

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

接近这个的最佳方法是什么? 任何建议,将不胜感激。

3 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

答案 1 :(得分:0)

我想到了两个想法:

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

将答案加载到javascript数组中,并以那种方式呈现它们,然后再使用拖动更改功能。

答案 2 :(得分:0)

在我们使用查询群集数据库之前,创建覆盖位置字段的索引(例如主键),每次更改时使用索引条目更新多行,依此类推,让我们考虑以下内容:

  1. 在最糟糕的情况下菜单会有多长时间?
  2. 您真的需要从菜单中获取单独的行,或者只要您需要显示一个菜单,您需要选择所有行吗?
  3. 大多数情况下,这些案例可以通过更简单,实用的方法解决,对于作为程序员来说,这也会更容易。如果菜单不会太长并且您每次需要阅读它时可能都需要它,为什么不将它保存为程序中的列表(任何类型的项目),并使用任何方法对其进行序列化(例如JSON或Python Pickle)在将其作为带有文本字段的单行存储在数据库中之前?如果菜单在列表中,重新排序其元素将非常简单,菜单的读取操作将要求数据库的单行SELECT,并且写入操作将需要单个UPDATE,而无需保持更新位置字段