A表  (年级)
id name
1 一年级
2 二年级
3 三年级  B表   (班级学生)
id parentId name
1 1 a
2 1 b
3 2 c
4 3 d
5 1 e
6 2 fB表中的ParentId是A表中的id的外键 想要的结果 (每个年级对应多少人)
id name count  
1 一年级 3
2 二年级 2
3 三年级 1以上功能怎么用存储过程实现  用循环方式去去读每个年级的人  不用一条联合查询完成

解决方案 »

  1.   

    select id,name, (select count(*) from b where parentId=a.id)
    from a
      

  2.   

    select T.id,T.name,count(*)
    from
    (
    select A.id,A.name
    from A,B
    where A.id=B.parentId
    )T
    group by T.id
      

  3.   

    select T.id,T.name,count(*)
    from
    (
    select A.id,A.name
    from A,B
    where A.id=B.parentId
    )T
    group by T.id,T.name
      

  4.   

    没有必要用SP
    DELIMITER $$USE `aa`$$DROP PROCEDURE IF EXISTS `yb`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `yb`()
    BEGIN
    DECLARE done INT DEFAULT 0;
    DECLARE zid INT;
    DECLARE cur1 CURSOR FOR SELECT DISTINCT id FROM la;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
    OPEN cur1;
    FETCH cur1 INTO zid;
      WHILE done=0 DO
      SELECT COUNT(*) INTO @za FROM lb WHERE parentId=zid;
      SELECT @za;
      UPDATE la SET gg=@za WHERE id=zid;
             FETCH cur1 INTO zid;
      END WHILE;
    END$$DELIMITER ;
      

  5.   

    SELECT *,ZZ1(ID) FROM laDELIMITER $$CREATE FUNCTION `ZZ1`(ZID INT)
        RETURNS INT
        BEGIN
     RETURN (SELECT COUNT(*) FROM LB WHERE parentId=zid);
        END$$DELIMITER ;
      

  6.   


    这个种是可以达到目的 我的语句如下:
    select a.*, b.cardworth,(select count(id)  from CardCenter where isflag =1 and  taskId=a.id ) as openNumber, c.trueName 
    from CardTask a, CardType b,UserManager c where a.typeId = b.id  and a.adminName = c.userId  order by a.id desc 也试过你的方法   我的则个表有几十万条数据呢    我的语句和你给我的 现在都用100秒  这个性能不行
    下面是我用代码分开查询 用了十几秒   所以我想用存储过程循环读取那个总数赋值  感觉那样会快带点 查询集合
    PaginateResult paginateResult = payFactoryFacade.getCardTaskFactory().findCardTaskRecordList(payLook.getStart(),payLook.getNumber());

    List<CardTaskExtendReturn> cardTask = paginateResult.getList();
    List<CardTaskExtendReturn> cardTaskBack = new ArrayList<CardTaskExtendReturn>();

    //循环集合
    for(int i=0;i<cardTask.size();i++){CardTaskExtendReturn cardTaskBean = cardTask.get(i);
    System.out.print(+cardTaskBean.getId()+",");

    //根据单据号编号查询开卡数量
    int openNumber = payFactoryFacade.getCardCenterFactory().getTotalOpenCardNumber("", "", cardTaskBean.getId()+"", "1");

    cardTaskBean.setOpenNumber(openNumber);

    cardTaskBack.add(cardTaskBean);
    }  
      

  7.   

    呵呵,单位禁止QQ、MSN之类的,就在这里吧
      

  8.   

    我想知道通过存储过程 循环能赋值吗  就像我上面写的那个用十几秒的java代码  用存储过程不要一条sql语句的  循环赋值 查出返回结果集如下:id name count   
    1 一年级 3
    2 二年级 2
    3 三年级 1
      

  9.   

    你仔细看过4、5 的代码没有?4楼SP,5楼UDF
      

  10.   

    楼主总算把实际的语句贴出来了。select a.*, b.cardworth,
    (select count(id)  from CardCenter where isflag =1 and  taskId=a.id ) as openNumber, 
    c.trueName  
    from CardTask a, CardType b,UserManager c 
    where a.typeId = b.id  and a.adminName = c.userId  
    order by a.id desc  检查一下你的
    select a.*, b.cardworth,
    c.trueName  
    from CardTask a, CardType b,UserManager c 
    where a.typeId = b.id  and a.adminName = c.userId  
    order by a.id desc  这样不加统计,速度如何?如果仍慢则应该考虑如何提升这个语句的效率。 如果快,则创建索引create index xx on CardCenter(taskId,isflag);
      

  11.   


    我给taskId创建索引了  一下子快了好多   但是不知道一个表最多可以创建多少个索引  
    多创建索引好吗  
    还是没人告诉我用存储过程怎么循环查询赋值  
      

  12.   


    我给taskId加上索引 快多了  但是不知道一个表最多可以建多少个   什么时候最优
    还是没人告诉我用存储过程怎么实现 循环赋值   
      

  13.   

    你仔细看过4、5 的代码没有?4楼SP,5楼UDF
      

  14.   

    用下述数据,结果正确 
    A表 (年级)
    id name
    1 一年级
    2 二年级
    3 三年级   B表 (班级学生)
    id parentId name
    1 1 a
    2 1 b
    3 2 c
    4 3 d
    5 1 e
    6 2 fB表中的ParentId是A表中的id的外键  想要的结果 (每个年级对应多少人)
    id name count   
    1 一年级 3
    2 二年级 2
    3 三年级 1
      

  15.   

    用存储过程不会比这个SQL语句更快。
    表中可以添加足够多的索引了。好像是 1024个。