我正在尝试在Php和MySql中构建动态菜单(带子菜单)。并尝试使用此菜单构建动态编辑器进行操作,创建,删除等。在创建菜单类别时,我已经堆叠了它的位置。要好好理解一下mysql table structure =>
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表来定义创建的类别(前进或后退)的位置?谢谢:))
答案 0 :(得分: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之间进行转换是您工作的一部分 使用递归,你会没事的。 :)
答案 1 :(得分: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,则它是根菜单。
这是一个示例菜单:
Home&花园
- 起居室
- 餐厅
- 浴室
- 卧室
- 花园&学院
ELECTRICALS
- 声音&视觉
- 计算机和手机
- 家用电器
- 小家电
它会像这样存储:
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混淆)和ID“Living”房间“将是3,”餐厅“的ID将是4 ...因为我们在ID字段上自动递增。
所以,如果你想在Sound&中找到一个子类别。愿景,首先您会找到ID,在这种情况下它将是8
,然后您将添加父记录为8
的新记录。
子子类别示例:
Electricals
- Sound & Vision
* Televisions
* Audio
您可以插入这些记录:
INSERT INTO menu
(parent_id, sort_id, title)
VALUES
(8, 1, "Televisions"),
(8, 2, "Audio");