1

我想在 MYSQL 中创建一个过程,它将从我的嵌套类别结构中检索我的数据:

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| category_id | int(11)      | NO   | PRI | NULL    | auto_increment |
| category    | varchar(255) | YES  |     | NULL    |                |
| description | varchar(255) | YES  |     | NULL    |                |
| parent_id   | int(11)      | YES  |     | 0       |                |
| sequence    | int(11)      | YES  |     | 0       |                |
+-------------+--------------+------+-----+---------+----------------+

示例数据:

CREATE TABLE `categories` (
  `category_id` INTEGER(11) NOT NULL AUTO_INCREMENT,
  `category` VARCHAR(255),
  `description` VARCHAR(255),
  `parent_id` INTEGER(11) DEFAULT '0',
  `sequence` INTEGER(11) DEFAULT '0',
  PRIMARY KEY (`category_id`),
  UNIQUE KEY `category_id` (`category_id`)
);
COMMIT;



/* Data for the `categories` table  (Records 1 - 14) */

INSERT INTO `categories` (`category_id`, `category`, `description`, `parent_id`, `sequence`)     VALUES 
  (2, 'Student Level', 'Students Level Grade...', 0, 0),
  (18, '3ème', NULL, 2, 1),
  (19, '5ème', NULL, 2, 2),
  (20, '6ème', NULL, 2, 3),
  (21, 'Lettres', NULL, 18, 0),
  (22, 'Séquence I : En route pour le brevet', NULL, 21, 0),
  (23, 'Séquence II : Jeannot et Colin', NULL, 21, 0),
  (24, 'Séquence III : De l''éducation', NULL, 21, 0),
  (25, 'Séquence IV : Pauline', NULL, 21, 0),
  (26, 'Séquence V : Œdipe roi', NULL, 21, 0),
  (27, 'Séquence VI : La planète des singes', NULL, 21, 0),
  (28, 'Séquence VII : La poésie engagée', NULL, 21, 0),
  (29, 'Blog Categories', 'Blog Categories', 0, 0),
  (30, 'Blog', 'Default Blog', 29, 0);

我希望创建一个我将调用的函数,例如 callGetFormatCategories()将返回以下字段和值:

字段 > 值

category_id > 其原始 category_id 值
类别> 其原始类别值
序列> 其原始序列
parent_id > 其原始 parent_id
级别> 例如 (Student Level = 1), (3_me = 2), (Lettres = 3) (S_quence I : En route pour le brevet = 4) 按层次结构分类的级别

结果应按级别排序,例如:

 Level 1
      Level 2
           Level 3
                Level 4
                Level 4
                Level 4
                Level 4
                Level 4
           Level 3
                Level 4
                Level 4
      Level 2
           Level 3
                Level 4
                Level 4

我尝试过使用各种示例,例如http://rpbouman.blogspot.com/2005/10/nesting-mysql-cursor-loops.html,但我仍然遇到问题:

CREATE DEFINER = 'root'@'localhost' PROCEDURE `catlist`()
    不确定的
    包含 SQL
    SQL 安全调用程序
    评论 ''
开始
    -- 完成触发
    DECLARE tDone boolean 默认 false;

    -- 我需要使用的可能字段
    声明 vCatID INT;
    声明 vCatName VARCHAR(255);
    声明 vParentID INT;
    声明 vSequence INT;
    声明 vLevel INT;

    DECLARE topCursor CURSOR FOR SELECT `category_id`,`category`,`parent_id`,`sequence` FROM `level_category`;
    DECLARE subCursor CURSOR FOR SELECT `category_id`,`category`,`parent_id`,`sequence` FROM `categories` WHERE parent_id = vCatID;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET tDone := TRUE;


    -- 创建临时 tblResult 来处理查询结果
    如果存在 tblResults,则删除临时表;
    如果不存在则创建临时表 tblResults (
        `category_id` int(11),
        `category` varchar(255),
        `parent_id` int(11),
        `sequence` int(11),
        `级别` int(11),
         主键(`category_id`)

    );


    设置 vLevel = 0;

    打开顶部光标;    
    TopLoop : LOOP -- 顶部循环开始
        FETCH topCursor INTO vCatID、vCatName、vParentID、vSequence;
        替换为 tblResults 值(vCatID、vCatName、vParentID、vSequence、vLevel);
        IF tDone THEN
            关闭顶部光标;
            离开顶部循环;
        万一;


        打开子光标;    
        子循环:循环
            FETCH subCursor INTO vCatID、vCatName、vParentID、vSequence;
            替换为 tblResults 值(vCatID、vCatName、vParentID、vSequence、vLevel);
            IF tDone THEN
                SET vLevel = vLevel + 1;
                设置 tDone := false;
                关闭子光标;
                离开子循环;
            万一;


        结束循环子循环;



    结束循环顶部循环;-- 顶部循环结束



    选择 * 从 tblResults;

结尾;
4

0 回答 0