有两个表,channel表,具有id,channelId,name字段.结构为树状.即
            A(1,0,"A")
                     /        \
                 B(2,1,"B")   C(3,1,"C")
                /        \            \
         D(4,2,"D")    E(5,2,"E")     F(6,3,"F)article表,具有id,channelId,title属性.channelId关联channel表中叶子结点的id,如上面D,E,F.要求使用mysql写存储过程,查出以下内容:
(1)查询出channel表指定ID的所有子channel.
(2)查询出channel表指定ID的所有叶子channel.
(3)查询出指定channelId的与所有叶子channel的ID关联的所有article.如指定ID为1,则查询出article表中所有channelId为4,5,6的article数据.最近在做一个CMS系统.我用JAVA可以遍历查询出来.但是我希望在数据库里用存储过程查询出来.

解决方案 »

  1.   

    你不防变一下表结构就很简单了 。
    字段:id name,left_node,right_node;
      

  2.   

    甚至还可以冗余一点,
    id, name, leftnode, rightnode, parent
      

  3.   

    修改原有树节点的数据结构,存储到mysql中btw:不知道在mysql中,树结构的存储是怎么样的
      

  4.   

    我记得MYSQL官方有一篇介绍这个结构的文章,你去搜索吧。
      

  5.   

    mysql> select * from tb_test;
    +------------+--------------+--------------+
    | ProdCateID | ProdCateName | ParentCateID |
    +------------+--------------+--------------+
    |          1 | 服装            |            0 |
    |          2 | 箱包             |            0 |
    |          3 | 内衣             |            1 |
    |          4 | 外套             |            1 |
    |          5 | 男箱包             |            2 |
    |          6 | 女箱包            |            2 |
    |          7 | 内裤            |            3 |
    |          8 | 文胸             |            3 |
    |          9 | 男外套             |            4 |
    |         10 | 女大衣            |            4 |
    |         11 | 男用钱包            |            5 |
    |         12 | 女用钱包           |            6 |
    +------------+--------------+--------------+
    SP代码如下:
    DELIMITER $$DROP PROCEDURE IF EXISTS `tennis`.`sp_tree_test` $$
    CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_tree_test`(in parent_id int)
    begin
        declare level smallint default 0;
        declare cnt int default 0;
        create temporary table tt(ProdCateID int,ProdCateName varchar(20),
                                  ParentCateID int,level smallint,sort varchar(1000));
        create temporary table tt2(ProdCateID int,ProdCateName varchar(20),
                                  ParentCateID int,level smallint,sort varchar(1000));    insert into tt select ProdCateID,ProdCateName,
                              ParentCateID,level,cast(ProdCateID as char)
                       from tb_test
                       where ParentCateID=parent_id;    select row_count() into cnt;
        insert into tt2 select * from tt;    while cnt>0 do
            set level=level+1;
            truncate table tt;
            insert into tt select a.ProdCateID,a.ProdCateName,
                                  a.ParentCateID,level,concat(b.sort,a.ProdCateID)
                           from tb_test a,tt2 b
                           where a.ParentCateID=b.ProdCateID and b.level=level-1;
            select row_count() into cnt;
            insert into tt2 select * from tt;
        end while;
        select ProdCateID,
               concat(space(a.level*2),'|--',a.ProdCateName) ProdCateName
        from tt2 a
        order by sort;    drop table tt;
        drop table tt2;
    end $$DELIMITER ;##执行mysql> call sp_tree_test(0);
    +------------+-----------------+
    | ProdCateID | ProdCateName    |
    +------------+-----------------+
    |          1 | |--服装            |
    |          3 |   |--内衣           |
    |          7 |     |--内裤        |
    |          8 |     |--文胸         |
    |          4 |   |--外套           |
    |         10 |     |--女大衣        |
    |          9 |     |--男外套         |
    |          2 | |--箱包             |
    |          5 |   |--男箱包           |
    |         11 |     |--男用钱包        |
    |          6 |   |--女箱包          |
    |         12 |     |--女用钱包       |
    +------------+-----------------+
    12 rows in set (0.30 sec)
      

  6.   

    oracle就方便多了,直接start with connect by。
      

  7.   

     liangCK  ,谢谢你。
      

  8.   

    liangCK 正是我要找到,强。我去试一试效果。
      

  9.   

    liangCK  首先谢谢你提供的东东!我刚好也用到这一块!
    但是,我有一个问题要问您:
    我也写了一个 但是我的列名是 带下划线的,如:class_id ,class_name , parent_id 
    查询出来的结果有问题,我把你写的这个过程建立了和你一样的表,查询的结果是正确的,我又建了一个表,只是字段名带有下划线,结果是错误的,我只是去掉了下划线,别的没有动,结果确是正确的,我很郁闷!我反复测试了很久不知道为什么?mysql 允许字段名 带下划线的呀!
    请 liangCK  您帮忙解释一下!
    也请各位高手指点一下
      

  10.   

    liangCK 这个MM好可爱,   举的例子太有女人味了,嗯,我喜欢!做你男友一定给你买好多漂亮衣服。
    |          1 | |--服装            |
    |          3 |   |--内衣           |
    |          7 |     |--内裤        |
    |          8 |     |--文胸         |
    |          4 |   |--外套           |
    |         10 |     |--女大衣        |
    |          9 |     |--男外套         |
    |          2 | |--箱包             |
    |          5 |   |--男箱包           |
    |         11 |     |--男用钱包        |
    |          6 |   |--女箱包          |
    |         12 |     |--女用钱包