【问题标题】:PHP/MySQL Reorder Menu with Position set in table表中设置位置的 PHP/MySQL 重新排序菜单
【发布时间】:2012-06-10 03:58:00
【问题描述】:

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

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

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

【问题讨论】:

  • 您的问题是关于如何在数据库中实现重新排序或如何在页面上显示重新排序的菜单?

标签: php mysql dynamic menu position


【解决方案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;

【讨论】:

  • 这是在正确的轨道上,但并非完美无缺。添加新项目有效。但是更新旧的会遇到一些问题。我需要花一些时间来研究逻辑并尝试一些事情,但这个答案可能会让我到达那里。
  • 如果位置列是UNIQUE,则使 id 井井有条,但我相信你知道。哦 - 我在higherItemPosition 查询中犯了错误(有>=,应该只是= - 更正)
【解决方案2】:

想到两个想法:

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

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-04
      • 2013-07-04
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      相关资源
      最近更新 更多