求一个mysql的存储过程..

staryjk 2013-05-24 03:25:12
现在有一个报表,数据量太多了.我想用一个存储过程来处理部分返回数据..
现在的SQL如下:

SELECT Sum(ul.money) as total FROM userlog AS ul left Join tz AS tz ON ul.tzid = tz.id WHERE
ul.uid in(4213,4215,4216,4218,4219,4224,4226,4232,4235,4248,4251,4255,4262,4268,4308,4354)
AND tz.zt < 4 and ( ul.logtype ='tzfd' or ul.logtype = 'zhfd' or ul.logtype = 'dlfd' ) and
( ul.logtime >='1369074600' and ul.logtime <= '1369161000' )


参数uid和logtime是传入的参数.要求返回相关的数据.

...全文
131 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2013-05-24
  • 打赏
  • 举报
回复
引用 8 楼 staryjk 的回复:
我要返回根据传入的UID和时间,返回money的总和. 我这样写应该可以明白了点吧
为什么不直接用SQL语句呢?在PHP代码中根据已知的信息,直接生成顶楼的字符串,然后提交到MYSQL执行不就行了? 用存储过程对这个需求没有什么性能上或者程序维护上的帮助啊。
wwwwb 2013-05-24
  • 打赏
  • 举报
回复
引用 6 楼 staryjk 的回复:
我这个在实际的表中的UID和logtime都是int类型的...你讲的我是真的不会. 能不能写一个我直接使用PHP调用传入参数的就能返回信息的... 另外返回的数据是带小数点的... 谢谢了.
建议你看看MYSQL的HELP,动手做一下吧,有问题再问 logtime都是int类型的,你的SQL语句logtime >='1369074600'? DELIMITER $$ DROP PROCEDURE test$$ CREATE PROCEDURE test(auid VARCHAR(100),alogtime1 INT,alogtime2 INT ,OUT aa DECIMAL) BEGIN SELECT SUM(ul.money) AS total FROM userlog AS ul LEFT JOIN tz AS tz ON ul.tzid = tz.id WHERE FIND_IN_SET(ul.uid,auid) AND tz.zt < 4 AND ( ul.logtype ='tzfd' OR ul.logtype = 'zhfd' OR ul.logtype = 'dlfd' ) AND ( ul.logtime >=alogtime1 AND ul.logtime <= alogtime2 ); END$$ DELIMITER ;
rucypli 2013-05-24
  • 打赏
  • 举报
回复
引用 6 楼 staryjk 的回复:
我这个在实际的表中的UID和logtime都是int类型的...你讲的我是真的不会. 能不能写一个我直接使用PHP调用传入参数的就能返回信息的... 另外返回的数据是带小数点的... 谢谢了.
慢慢来
staryjk 2013-05-24
  • 打赏
  • 举报
回复

CREATE TABLE `userlog` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`idchar`  char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '随机编号' ,
`fid`  int(11) NULL DEFAULT NULL COMMENT '0' ,
`uid`  int(11) NULL DEFAULT NULL ,
`tzid`  int(11) NULL DEFAULT NULL ,
`czlx`  char(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`logtype`  char(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money`  double(20,6) UNSIGNED NULL DEFAULT 0.000000 ,
`oldmoney`  double(20,6) UNSIGNED NOT NULL ,
`logtime`  int(11) NULL DEFAULT NULL ,
`logip`  char(16) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`content`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX `uid` (`uid`) USING BTREE ,
INDEX `tzid` (`tzid`) USING BTREE ,
INDEX `czlx` (`czlx`) USING BTREE ,
INDEX `logtype` (`logtype`) USING BTREE ,
INDEX `money` (`money`) USING BTREE ,
INDEX `logtype_2` (`logtype`) USING BTREE 
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
COMMENT='tz=tz'
AUTO_INCREMENT=1
ROW_FORMAT=COMPACT;
我要返回根据传入的UID和时间,返回money的总和. 我这样写应该可以明白了点吧
ACMAIN_CHM 2013-05-24
  • 打赏
  • 举报
回复
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。 参考一下这个贴子的提问方式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) 这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
staryjk 2013-05-24
  • 打赏
  • 举报
回复
我这个在实际的表中的UID和logtime都是int类型的...你讲的我是真的不会. 能不能写一个我直接使用PHP调用传入参数的就能返回信息的... 另外返回的数据是带小数点的... 谢谢了.
wwwwb 2013-05-24
  • 打赏
  • 举报
回复
好象不行啊..这个UID实际比这个要多多了, 你可以将UID保存在表中,再与工作表连接,要修改SQL语句 还有这个传入的时候类型,DATETIME好象不对吧,是不是应该为timestamp或者为int类型的? 用UNIX_TIMESTAMP函数转换一下
staryjk 2013-05-24
  • 打赏
  • 举报
回复
这个UID不是固定的,是根据相关条件查询出来的.
引用 2 楼 wwwwb 的回复:
or 把SUM(ul.money)的值插入到表中保存,再 取值
staryjk 2013-05-24
  • 打赏
  • 举报
回复
好象不行啊..这个UID实际比这个要多多了,还有这个传入的时候类型,DATETIME好象不对吧,是不是应该为timestamp或者为int类型的? 我用你这个创建过后,执行返回为null
引用 1 楼 wwwwb 的回复:
DELIMITER $$ DROP PROCEDURE test$$ CREATE PROCEDURE test(auid VARCHAR(100),alogtime1 DATETIME,alogtime2 DATETIME,OUT aa INT) BEGIN SELECT SUM(ul.money) AS total FROM userlog AS ul LEFT JOIN tz AS tz ON ul.tzid = tz.id WHERE FIND_IN_SET(ul.uid,auid) AND tz.zt < 4 AND ( ul.logtype ='tzfd' OR ul.logtype = 'zhfd' OR ul.logtype = 'dlfd' ) AND ( ul.logtime >=alogtime1 AND ul.logtime <= alogtime2 ); END$$ DELIMITER ; call test('4213,4215,4216,4218,4219,4224,4226,4232,4235,4248,4251,4255,4262,4268,4308,4354','1369074600','1369161000',@a); select @a
wwwwb 2013-05-24
  • 打赏
  • 举报
回复
or 把SUM(ul.money)的值插入到表中保存,再 取值
wwwwb 2013-05-24
  • 打赏
  • 举报
回复
DELIMITER $$ DROP PROCEDURE test$$ CREATE PROCEDURE test(auid VARCHAR(100),alogtime1 DATETIME,alogtime2 DATETIME,OUT aa INT) BEGIN SELECT SUM(ul.money) AS total FROM userlog AS ul LEFT JOIN tz AS tz ON ul.tzid = tz.id WHERE FIND_IN_SET(ul.uid,auid) AND tz.zt < 4 AND ( ul.logtype ='tzfd' OR ul.logtype = 'zhfd' OR ul.logtype = 'dlfd' ) AND ( ul.logtime >=alogtime1 AND ul.logtime <= alogtime2 ); END$$ DELIMITER ; call test('4213,4215,4216,4218,4219,4224,4226,4232,4235,4248,4251,4255,4262,4268,4308,4354','1369074600','1369161000',@a); select @a

56,679

社区成员

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

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