【发布时间】:2013-01-31 03:54:08
【问题描述】:
像这样对表格进行排序的最佳方法是什么:
CREATE TABLE category(
id INT(10),
parent_id INT(10),
name VARCHAR(50)
);
INSERT INTO category (id, parent_id, name) VALUES
(1, 0, 'pizza'), --node 1
(2, 0, 'burger'), --node 2
(3, 0, 'coffee'), --node 3
(4, 1, 'piperoni'), --node 1.1
(5, 1, 'cheese'), --node 1.2
(6, 1, 'vegetariana'), --node 1.3
(7, 5, 'extra cheese'); --node 1.2.1
按id或name分层排序:
'pizza' //节点 1
'piperoni' //节点 1.1
'奶酪' //节点 1.2
'额外的奶酪' //节点 1.2.1
'vegetariana' //节点 1.3
'burger' //节点 2
'coffee' //节点 3
编辑:名称末尾的数字是为了更好地可视化结构,而不是用于排序。
编辑 2: 多次提到...name "cheese 1.2" 末尾的数字仅用于可视化目的,不用于排序.我把它们作为cmets移动了,太多人混淆了,对不起。
【问题讨论】:
-
Oracle 有一种方法可以使用
START WITH parent_id = 0 CONNECT BY PRIOR id = parent_id ORDER SIBLINGS BY id ASC。我认为MySQL没有这样的分层查询。 -
@Benoit:实际上几乎所有的 DBMS except 对于少数(包括 MySQL)都可以使用递归公用表表达式来执行类似的操作。
-
表格结构是否已经定义或者您正处于规划阶段并且可以选择其他结构?您计划在表中包含多少条目?是经常修改还是对它有很多读取访问权限很重要?
-
@t.niese 可以添加更多列(top_parent_id,depth_level ..),但如果可能的话,我正在寻找这种结构中的解决方案。可以添加深度(树不限于 3 级),但通常不应超过 50-100 个条目,并且此特定查询的速度不是问题。
-
查看Managing Hierarchical Data in MySQL 了解一些食谱。