select code from t group by code
得到这样的结果集合,
a,b,c,d
select * from t where code in (select code from t group by code)
可否把上面这个结果用存储过程来写?
将select code from t group by code分别赋值给变量X,然后把这个变量的值带入select语句,形成
select * from t where code=X
(X依次取a,b,c,d)
请问,mysql可以做到吗?

解决方案 »

  1.   

    可以做到。但
     select * from t where code in (select code from t group by code) 不就等于 select * from t
      

  2.   

    LZ 脑子转不过湾?
    select   *   from   t   where   code   in   (select   code   from   t   group   by   code) 
    就是等于 select * from t
      

  3.   

    不是我脑袋有问题,是我还有进一步的意图,
    select   *   from   t   where   code="a" order by price  desc limit 5 
    可以得到code分组的,a组前5大,
    select   *   from   t   where   code="b" order by price  desc limit 5
    可以得到code分组的,b组前5大,
    select   *   from   t   where   code="c" order by price  desc limit 5
    可以得到code分组的,c组前5大,
    select   *   from   t   where   code="d" order by price  desc limit 5
    可以得到code分组的,d组前5大,
    但是就不可以这样写
    select   *   from   t   where   code  in (select code from t group by code) order by price  desc limit 5 
    这样得到的是a组的前5大,
    因此我想到了上面那个用存储过程的方法,我用其他编程语言调用mysql也可以获得结果,思路也是这个,但是我想,如果用mysql本身的存储过程实现可能会更快。
    csdn上面的老帖,分组取最大n个的方法,当n大于1的时候,数据量大的情况下,没有一种可行,全部执行时间超过两个小时,我不耐烦中断mysql的查询,因为,虽然语法正确,但是,mysql没有任何输出,不知道执行中途是否出现其他问题,用其他语言调用mysql实现,可以控制输出,每次遍历一个code的时候,输出一部分到屏幕,这样我知道究竟会出什么问题,在数据量大时,就这么一个简单的分组取前5大的计算,我用程序实现花了5个半小时。
    因此,我想用存储过程来实现,思路完全一致,上面的问题简化了,如果楼顶可以用存储过程实现,那么我的这个完全类似的问题(仅仅数据量大而已),也可以,并非脑袋进水。
      

  4.   

    create table t
    (
    code varchar(10),
    price int
    );
    insert t select 
    'a',2 union all select 
    'a',3 union all select 
    'a',4 union all select 
    'a',5 union all select 
    'a',9 union all select 
    'a',8 union all select 
    'b',2 union all select 
    'b',3 union all select 
    'b',1 union all select 
    'b',5 union all select 
    'b',6 union all select 
    'b',0 union all select 
    'c',2 union all select 
    'c',1 ;
    delimiter $$create procedure sCode ()
    begin 
    declare icode varchar(10);
    declare cur_sCode cursor for select distinct code from t ;
    declare exit HANDLER for not found close cur_sCode;
    open cur_sCode ;
            repeat
    fetch cur_sCode into icode;
                    select * from t where code=icode order by price limit 5;
     until 0 end repeat;
    close cur_sCode;
    end;
    $$delimiter ;mysql> call  sCode();
    +------+-------+
    | code | price |
    +------+-------+
    | a    |     2 |
    | a    |     3 |
    | a    |     4 |
    | a    |     5 |
    | a    |     8 |
    +------+-------+
    5 rows in set (0.04 sec)+------+-------+
    | code | price |
    +------+-------+
    | b    |     0 |
    | b    |     1 |
    | b    |     2 |
    | b    |     3 |
    | b    |     5 |
    +------+-------+
    5 rows in set (0.12 sec)+------+-------+
    | code | price |
    +------+-------+
    | c    |     1 |
    | c    |     2 |
    +------+-------+
    2 rows in set (0.18 sec)
      

  5.   

    可否解释一下这句话的含义?
    declare exit HANDLER for not found close cur_sCode;