3

我正在尝试在 PHP 和 MySql 中构建一个动态菜单(带有子菜单)。并尝试构建动态编辑器以使用此菜单进行操作、创建、删除等。在创建菜单类别时,我已经堆叠了它的位置。要理解好,请看一下 mysql 表结构 =>

create table menu(
id int(5) NOT NULL AUTO_INCREMENT PRIMARY KEY,
sort_id UNSIGNED BIGINT NOT NULL,
title VARCHAR(20) NOT NULL,
etc ...);

我正在使用 sort_id 对菜单类别进行排序,在创建过程中我给了这个列不同的值(第一次,默认情况下),因为在创建另一个类别之后,我将值加 1 并减 1,但我认为它这样做是很糟糕的。任何想法如何管理 MySql 表以定义创建类别的位置(向前或向后)?谢谢 :)

4

2 回答 2

3

在 sort_id 中,只需输入父菜单的 id,对于根菜单,只需输入 0/NULL。

示例:(sid = sort_id)

id|sid| title
1 | 0 | Menu1
2 | 0 | Menu2
3 | 1 | Submenu1of1
4 | 1 | Submenu2of1
5 | 2 | Submenu1of2
6 | 4 | Subsubmenu1of2of1

将指:

1 : Menu1
    3 : Submenu1of1
    4 : Submenu2of1
        6 : Submenu1of2of1
2 : Menu2
    5 : Submenu1of2

现在在第 1 步和第 2 步之间进行转换是您工作的一部分。
使用递归,你会没事的。:)

于 2012-08-07T20:38:34.790 回答
3

您不应该像@Jerska 所说的那样使用 sort_id ,因为那样您将无法对子菜单进行排序并且它会使您的程序逻辑复杂化/混淆。你可以有一张这样的桌子

CREATE TABLE menu(
  id INT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY(id),
  parent_id INT,
  FOREIGN KEY(parent_id) REFERENCES menu(id),
  sort_id INT,
  title VARCHAR(100)
) ENGINE=InnoDB;

如果 parent_id 设置为 null 那么它是一个根菜单。


这是给您的示例菜单:

家居和花园
- 客厅
- 餐厅
- 浴室
- 卧室
- 花园和温室
电器
- 声音和视觉
- 计算机和电话
- 家用电器
- 小家电

它将像这样存储:

INSERT INTO menu
  (parent_id, sort_id, title)
VALUES
  (null, 1, "Home & Garden"),
  (null, 2, "Electricals"),
  (1, 1, "Living Room"),
  (1, 2, "Dining Room"),
  (1, 3, "Bathroom"),
  (1, 4, "Bedroom"),
  (1, 5, "Garden & Conservatory"),
  (2, 1, "Sound & Vision"),
  (2, 4, "Small Appliances"),
  (2, 3, "Home Appliances"),
  (2, 2, "Computing & Phones");

如果你真的按这个顺序插入它们,“Home & Garden”的 ID 将为 1,“Electricals”的 ID 为 2(不要与 sort_id 混淆),“Living Room”的 ID 为3,“Dining Room”的 ID 将是 4... 因为我们在 ID 字段上自动递增。

因此,如果您想在 Sound & Vision 中有一个子类别,首先您会找到 ID,在这种情况下它会找到8,然后您将添加新记录,其父 ID 为8.

示例子子类别:

Electricals  
- Sound & Vision  
  * Televisions  
  * Audio  

您将插入这些记录:

INSERT INTO menu
  (parent_id, sort_id, title)
VALUES
  (8, 1, "Televisions"),
  (8, 2, "Audio");
于 2012-08-07T20:45:00.030 回答