这里第三个问题 就是你要的
你参考一下这个
http://publish.it168.com/2005/1127/20051127009601.shtml?positioncode=1547某棵子树所有子节点信息 
  
  前面的两种查询返回的都是标量值,这里的查询需返回某棵子树的所有子节点的信息,这是一个结果集,需要用 table 数据类型来存储。函数定义如下: 
  
  CREATE FUNCTION dbo.GetSubtreeInfo 
  
  ( @manager_id AS int 
  
  ) 
  
  RETURNS @treeinfo table 
  
  ( [员工号码] [char] (5) NOT NULL, 
  
  [姓名] [char] (10) NOT NULL, 
  
  [年龄] [int] NOT NULL, 
  
  [工资] [money] NOT NULL, 
  
  [上级号码] [char] (5) NULL, 
  
  [级别] [int] NOT NULL 
  
  ) 
  
  其中,@manager_id 代表要查询的上司的员工号码,返回的是其所有下属的信息,这些信息存放在 table 型变量 @treeinfo 中。 
  
  由于该查询返回的是一个结果集,因此已经不能使用递归的方法来实现,我们使用循环的方法来实现,循环的过程为:将参数 @manager_id 所代表的上司的信息插入到表中,赋予级别0;级别增加为1,将所有上级号码为以上 @manager_id 的员工信息插入到表中;级别增加为2,将所有上级号码与第2步插入的记录中的员工号码一致的员工信息插入到表中;依次增加级别,直到找不到上级号码与前一步插入的纪录中的员工号码一致的员工信息为止。 
  
  为了实现这个循环,我们要用系统函数 @@ROWCOUNT 来判断前一步中是否有新的记录被插入到表中。如果有,则循环继续;如果无,则循环结束。另外,我们在表中增加了一个名为“级别”的字段,既可以显示出所在的级别关系,还可以用来代表每一次新插入的记录,可谓一举两得。完整的函数定义如下: 
  
  CREATE FUNCTION dbo.GetSubtreeInfo 
  
  ( @manager_id AS char(5) 
  
  ) 
  
  RETURNS @treeinfo table 
  
  ( [员工号码] [char] (5) NOT NULL, 
  
  [姓名] [char] (10) NOT NULL, 
  
  [年龄] [int] NOT NULL, 
  
  [工资] [money] NOT NULL, 
  
  [上级号码] [char] (5) NULL, 
  
  [级别] [int] NOT NULL 
  
  ) AS 
  
  BEGIN 
  
  DECLARE @level AS int 
  
  SELECT @level = 0 
  
  INSERT INTO @treeinfo 
  
  SELECT [员工号码], [姓名], [年龄], [工资], [上级号码], @level 
  
  FROM [员工信息] 
  
  WHERE [员工号码] = @manager_id 
  
  WHILE @@ROWCOUNT > 0 
  
  BEGIN 
  
  SET @level = @level + 1 
  
  INSERT INTO @treeinfo 
  
  SELECT E.[员工号码], E.[姓名], E.[年龄], E.[工资], E.[上级号码], @level 
  
  FROM [员工信息] AS E JOIN @treeinfo AS T 
  
  ON E.[上级号码] = T.[员工号码] AND T.[级别] = @level - 1 
  
  END 
  
  RETURN 
  
  END 
  
  下面是测试的结果: 
  
  SELECT * FROM dbo.GetSubtreeInfo(‘E9903’) 
  
  员工号码 姓名 年龄 工资 上级号码 级别 
  
  -------- --------- ------- -- 
  
  E9903 郑可可 38 5000.0000 E9901 0 
  
  E9906 肖遥 26 3350.0000 E9903 1 
  
  E9907 黄菁菁 22 2800.0000 E9906 2 

解决方案 »

  1.   

    你使用sql server可以给数据库加函数的特性,可是mysql没有这个特性,怎么用啊
      

  2.   

    mysql> create table me(id int not null auto_increment primary key,
        -> name varchar(10) not null,type int not null);
    Query OK, 0 rows affected (0.06 sec)mysql> insert into me values(1,'ly',3),(2,'wf',3),(3,'gg',4),(4,'pp',5);
    Query OK, 4 rows affected (0.02 sec)
    Records: 4  Duplicates: 0  Warnings: 0mysql> select * from me;
    +----+------+------+
    | id | name | type |
    +----+------+------+
    |  1 | ly   |    3 |
    |  2 | wf   |    3 |
    |  3 | gg   |    4 |
    |  4 | pp   |    5 |
    +----+------+------+
    4 rows in set (0.00 sec)mysql> select * from me where type<=4;
    +----+------+------+
    | id | name | type |
    +----+------+------+
    |  1 | ly   |    3 |
    |  2 | wf   |    3 |
    |  3 | gg   |    4 |
    +----+------+------+
    3 rows in set (0.00 sec)因为经理的员工号越到后面就会越大,而且大的管理所有比他小的。
    当然也可以这样做,一样的效果。不知道是不是你想要的结果。
    mysql> select * from me where type < (select type from me where id=4);
    +----+------+------+
    | id | name | type |
    +----+------+------+
    |  1 | ly   |    3 |
    |  2 | wf   |    3 |
    |  3 | gg   |    4 |
    +----+------+------+
    3 rows in set (0.00 sec)
      

  3.   

    用元组的方法name 名字    num  员工号  managernum 经理号select c1.name from table c1,table c2 where c1.num = c2.managernum and c1.num=3;
      

  4.   

    to:hy2003fly() 
    我只是举个例子,其实经理的号不一定最大,是随意的。
    to: zuguanqun(小群)
    没看明白你的意思,能费心说明白一点吗?