create table t_dept
(
   n_dept_id            int(11) not null auto_increment,
   n_keyin_id           int(11) not null,
   n_dept_supervisor_id int(11) not null,
   n_dept_contact_id    int(11),
   n_dept_father_id     int(11),
   vc_dept_name         varchar(4000) not null,
   vc_dept_tel          varchar(4000),
   vc_note              varchar(8000),
   dt_del_time          datetime,
   primary key (n_dept_id)
);
其中:n_dept_id自己的ID, n_dept_father_id父ID。
有木有mysql大神帮我写一个一个通过自己的ID查询所有子节点ID的SQL。我参考了http://www.cnblogs.com/fromchaos/archive/2010/12/15/1907031.html,但是一直第一句话就报错,不知道原因。

解决方案 »

  1.   

    参考下贴中的多种方法。http://blog.csdn.net/ACMAIN_CHM/archive/2009/05/02/4142971.aspx
    MySQL中进行树状所有子节点的查询
      

  2.   

    参考了,我写的SQL。但是报错了。求解。SQL如下:CREATE DEFINER=`root`@`localhost` FUNCTION `getChildLst`(rootId INT) RETURNS text CHARSET gbk
    BEGIN
    DECLARE sTemp  text;
    DECLARE sTempChd  text; SET sTemp = '$';
     SET sTempChd =cast(rootId as char);
    WHILE sTempChd is not null DO
       SET sTemp = concat(sTemp,',',sTempChd);
       SELECT group_concat(n_dept_id) INTO sTempChd FROM t_dept where FIND_IN_SET(n_dept_father_id,sTempChd)>0;
     END WHILE;
     RETURN sTemp;
     END;
    测试: select * from t_dept
      where FIND_IN_SET(n_dept_id, getChildLst(4));
    显示了id为4的那一行。但是如果把4换成1.就会报错:data  too long  for column for 'sTemple'
      

  3.   


    参数4和1唯一的不同是,没有父ID为4的行。但是有福ID为1的行
      

  4.   

    给出你的测试数据。
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。