可否用存储过程来做这件事?

fnzh001 2010-08-02 11:03:42
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可以做到吗?
...全文
126 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
fnzh001 2010-08-04
  • 打赏
  • 举报
回复
可否解释一下这句话的含义?
declare exit HANDLER for not found close cur_sCode;
feixianxxx 2010-08-03
  • 打赏
  • 举报
回复
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)
feixianxxx 2010-08-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fnzh001 的回复:]
不是我脑袋有问题,是我还有进一步的意图,
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 w……
[/Quote]
LZ 我没有说你脑袋有问题 请不要误会。。

你的需求可以使用 存储过程+游标的形势解决~
fnzh001 2010-08-03
  • 打赏
  • 举报
回复
不是我脑袋有问题,是我还有进一步的意图,
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个半小时。
因此,我想用存储过程来实现,思路完全一致,上面的问题简化了,如果楼顶可以用存储过程实现,那么我的这个完全类似的问题(仅仅数据量大而已),也可以,并非脑袋进水。
zuoxingyu 2010-08-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 feixianxxx 的回复:]

open cur_sCode ;
repeat
fetch cur_sCode into icode;
select * from t where code=icode order by price limit 5;
until 0 end repeat;
[/Quote]

关键代码。
feixianxxx 2010-08-02
  • 打赏
  • 举报
回复
LZ 脑子转不过湾?
select * from t where code in (select code from t group by code)
就是等于 select * from t
ACMAIN_CHM 2010-08-02
  • 打赏
  • 举报
回复
可以做到。但
select * from t where code in (select code from t group by code)

不就等于

select * from t

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧