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

EDITはSQLフィドルのものを追加しました

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 に答える