按路径和排序顺序获取类别树

时间:2013-02-20 13:37:29

标签: mysql sql

我的类别结构如下所示。我的目的是通过单一查询获得类别结构。 我按路径对表格进行排序,然后得到类别树。

sort_order :表示具有相同级别的类别之间的排序顺序

enter image description here

当我运行查询

SELECT * FROM category order by path;

结果:

enter image description here

但结果必须如下所示,因为电子的sort_order是1,这小于计算机类别2的sort_order值

 - ELectronic 
 - - TV 
 - - - LCD 
 - - - - LED LCD 
 - Computer 
 - - Laptop

2 个答案:

答案 0 :(得分:1)

编辑添加了SQL Fiddle的东西

SQL Fiddle

MySQL 5.5.28架构设置

CREATE TABLE IF NOT EXISTS `category` (
  `id` int(11) NOT NULL,
  `parent_id` int(11) NOT NULL,
  `label` varchar(20) NOT NULL,
  `level` int(11) NOT NULL,
  `path` varchar(100) NOT NULL,
  `sortorder` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `category`
--

INSERT INTO `category` (`id`, `parent_id`, `label`, `level`, `path`, `sortorder`) VALUES
(0, 0, '', 0, '', 0),
(2, 0, 'Computer', 1, '.2.', 2),
(3, 0, 'Electronic', 1, '.3.', 1),
(4, 3, 'TV', 2, '.3.4.', 3),
(5, 2, 'Laptop', 2, '.2.5.', 4),
(6, 7, 'LED LCD', 4, '.3.4.7.6.', 5),
(7, 4, 'LCD', 3, '.3.4.7', 5);

查询1

SELECT 
  (
    SELECT group_concat( cast( g.sortorder AS char ) ORDER BY g.path ) AS gso
    FROM category AS g
    WHERE c.path LIKE concat( g.path, '%' )
  ) AS grsortorder, c. *
FROM `category` AS c
ORDER BY grsortorder

<强> Results

| GRSORTORDER | ID | PARENT_ID |      LABEL | LEVEL |      PATH | SORTORDER |
-----------------------------------------------------------------------------
|           0 |  0 |         0 |            |     0 |           |         0 |
|         0,1 |  3 |         0 | Electronic |     1 |       .3. |         1 |
|       0,1,3 |  4 |         3 |         TV |     2 |     .3.4. |         3 |
|     0,1,3,5 |  7 |         4 |        LCD |     3 |    .3.4.7 |         5 |
|   0,1,3,5,5 |  6 |         7 |    LED LCD |     4 | .3.4.7.6. |         5 |
|         0,2 |  2 |         0 |   Computer |     1 |       .2. |         2 |
|       0,2,4 |  5 |         2 |     Laptop |     2 |     .2.5. |         4 |

答案 1 :(得分:0)

看看是否有效:

SELECT * FROM category order by level, sort_order, path;

结果:

enter image description here