3

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

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

在此处输入图像描述

当我运行查询

SELECT * FROM category order by path;

结果:

在此处输入图像描述

但结果必须如下所示, 因为 Electronic 的 sort_order 为 1,这小于 Computer 类别 2 的 sort_order 值

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

2 回答 2

1

编辑添加了 SQL Fiddle 的东西

SQL小提琴

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

结果

| 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 |
于 2013-02-22T00:10:58.020 回答
0

看看这是否有效:

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

结果 :

在此处输入图像描述

于 2013-02-20T14:07:23.693 回答