0

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

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

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

4

3 回答 3

1

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

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

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

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

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

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

于 2012-06-06T06:31:11.370 回答
0

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

  1. 在最坏的情况下,菜单会得到多长时间?
  2. 你真的需要从菜单中获取单独的行,或者当你需要显示一个菜单时你需要选择它的所有行?

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

于 2012-06-06T08:14:27.337 回答
0

想到两个想法:

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

将答案加载到 javascript 数组中,然后以这种方式呈现它们,然后您就有了拖动更改的能力。

于 2012-06-06T06:31:30.027 回答