因为公司最近的一个项目,第一次用到了MySQL(5.10版本),之前听传说MySQL很厉害的样子,因为开源而神奇,但是现在用起来,

感觉并不好啊!我知道是我水平太down,呜呜呜,请各路神仙略施小技,拯救我于水深火热之中。

  本文主要针对以下两个问题:

  (1)存储过程单个参数传入值集合。

  (2)使用临时表实现实现对同一结果集的多次使用。

  也不说太多废话了,有下面数据表tb_address和数据,各个地区通过id和parentid实现层级关系:

  还有一个表tb_population,记录了那个区有多少人口,id是主键,townid是区的id:

 功能一: 

  现在要实现的功能是通过地区id查询人口,可以一次查询多个地区。为了实现这个功能,我创建了一个存储过程,

但是怎么传入多个id呢?这个难倒了我,在网上找了不少方法,终于用下面的代码实现了:

DROP PROCEDURE IF EXISTS pro_getDownPopulation;
CREATE PROCEDURE pro_getDownPopulation(ids BLOB)
BEGIN
SET @str1 = 'SELECT a.id,
a.address,
b.population
from tb_address a
RIGHT JOIN tb_population b on a.id=b.townid WHERE a.id in (';
SET @str2 = ')';
SET @asql = CONCAT(@str1, ids, @str2); PREPARE stmt FROM @asql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END;

执行该存储过程pro_getDownPopulation,得到结果如下:

实现是实现了,总感觉有点怪怪的,后来继续开发的过程中无意间发现有个FIND_IN_SET()函数,果断用上了,就是不知道性能好不好,

修改后的存储过程代码如下:

DROP PROCEDURE IF EXISTS pro_getDownPopulation2;
CREATE PROCEDURE pro_getDownPopulation2(ids BLOB)
BEGIN
SELECT a.id,
a.address,
b.population
from tb_address a
RIGHT JOIN tb_population b on a.id=b.townid WHERE FIND_IN_SET(a.id, ids);
END;

执行该存储过程pro_getDownPopulation2,得到结果如下:(注意两次传入参数的格式的不同)

我的两种实现方式就是这样,到底哪种好,没有经过性能方面的测试,还请大家指教!

功能二:

   按地方的层级(省、市、区)统计个地方的人口,并以树的结构显示统计结果(软件端显示)。因为有一个简单的结果集我要反复用到,

所以我使用了临时表,但是在网上查到的说法:同一个query里同一个临时表只能使用一次,故创建了多个相同结果的临时表,代码如下:

DROP PROCEDURE IF EXISTS pro_population_statistics;
CREATE PROCEDURE pro_population_statistics()
BEGIN
DROP TEMPORARY TABLE IF EXISTS tempTable1;
DROP TEMPORARY TABLE IF EXISTS tempTable2;
DROP TEMPORARY TABLE IF EXISTS tempTable3; CREATE TEMPORARY TABLE tempTable1
SELECT a.id shengID, a.address sheng,
b.id shiID, b.address shi,
c.id quID, c.address qu,
d.population FROM tb_address a
LEFT JOIN tb_address b on a.id = b.parentid
LEFT JOIN tb_address c on b.id = c.parentid
LEFT JOIN tb_population d on c.id = d.townid
WHERE a.parentid=''; CREATE TEMPORARY TABLE tempTable2 SELECT * from tempTable1;
CREATE TEMPORARY TABLE tempTable3 SELECT * from tempTable1; SELECT sheng, SUM(population) population from tempTable1 GROUP BY shengID
UNION
SELECT shi, SUM(population) from tempTable2 GROUP BY shiID
UNION
SELECT qu, population from tempTable3; END;

执行存储过程pro_population_statistics,结果如下:

  

  功能是实现了,但是我存在很多疑惑的地方,特别是同一个query里同一个临时表只能使用一次,

我使用多个临时表,用起来性能比较差,大家有什么解决的方法吗?

  我还有另外一个疑问:在一个存储过程里如何调用另外一个存储过程并保存后者返回的结果集?

很少写文章,排版上的问题请大家多多包涵and多多指导,谢谢!

菜鸟使用MySQL存储过程and临时表,供新手参考,请高手斧正的更多相关文章

  1. Servlet模板,一个供新手参考的模板

    由于这学期老师的进度是刚开始教JavaSE部分,而我的进度比较快,所以买了3本javaee的书,我根据自己的基础,选择了合适的开发实践,另外两本书都和框架相关,我自认为我的web基础还不是很牢固,所以 ...

  2. MySQL存储过程和临时表

    MySQL创建存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...

  3. MySQL 存储过程,游标,临时表创建

    -- -------------------------------------------------------------------------------- -- Routine DDL - ...

  4. 【源码】Word转PDF V1.0.1 小软件,供新手参考

    昨天有一朋友让我帮忙找一款Word转PDF的软件,今天自己捣鼓出点成果封装个Helper供大家使用~ 开源地址:https://github.com/dunitian/WordConvertPDF 软 ...

  5. 使用uniapp开发项目来的几点心得体会,供新手参考参考

    先说一下提前须要会的技术 要想快速入手uniapp的话,你最好提前学会vue.微信小程序开发,因为它几乎就是这两个东西的结合体,不然,你就只有慢慢研究吧. 为什么要选择uniapp??? 开发多个平台 ...

  6. 记录git多人协作开发常用的流程,供新手参考

    声明:博主写的博客都是经过自己总结或者亲测成功的实例,绝不乱转载.读者可放心看,有不足之处请私信我,或者给我发邮件:pangchao620@163.com. 写作目的: 记录一下我看完廖学锋老师的gi ...

  7. mysql存储过程----临时表 temporary

    在存储过程中可以使用临时表,下面有一个分割字符串的例子 语法 1.创建:create temporary table 表名(列信息); 2.删除:drop table 表名; 3.清空:truncat ...

  8. MySQL存储过程调试工具-dbForge Studio for MySQL

    工具官网地址:http://www.devart.com/dbforge/mysql/studio/ 对于某些存储过程很多且复杂的SQL的应用,在短时间内要使得所有MySQL存储过程和函数正常运行,那 ...

  9. 《MySQL 存储过程编程》-读书笔记

    本书结构: 第一部分:存储编程基础 第1章:存储过程程序基础 第2章:MySQL存储编程指南 第3章:语言基础 第4章:语句块 第5章:在存储程序中使用SQL 第一章:MySQL存储程序介绍 存储程序 ...

随机推荐

  1. Java基础总结1

    数据类型: byte    1字节 short   2字节 int        4字节 long     8字节 float     4字节 double   8字节 char       2字节 ...

  2. jdbc之工具类DBUtil的使用

    首先回顾一下jdbc的使用方法: 1. 注册驱动 2. 建立连接 3. 建立statement 4. 定义sql语句 5. 执行sql语句,如果执行的是查询需遍历结果集 6. 关闭连接 其中建立连接和 ...

  3. 关于.vbs文件恶搞,小伙伴电脑的

    这是,VBS是基于Visual Basic的脚本语言.VBS的全称是:Microsoft Visual Basic Script Edition.(微软公司可视化BASIC脚本版). 其语言类似Vis ...

  4. Linux性能优化-理解平均负载

    1 平均负载含义 当系统变慢的时候,我们一般使用 top 或 uptime 命令来查看系统平均负载情况. 正确定义:单位时间内,系统中处于可运行状态和不可中断状态的平均进程数.错误定义:单位时间内的c ...

  5. 你不知道的JS(2)深入了解闭包

    很久之前就想写一篇关于闭包的博客了,但是总是担心写的不够完全.不够好,不管怎样,还是要把我理解的闭包和大家分享下,比较长,希望耐心看完. 定义 说实话,给闭包下一个定义是很困难的,原因在于javasc ...

  6. Got error on conf /etc/mha/app1.cnf: Parameter name master_ip_failover_scrip is invalid!

    问题: [root@db03-53 ~]# masterha_check_repl --conf=/etc/mha/app1.cnf Tue Apr 2 20:24:58 2019 - [warnin ...

  7. javascript函数的上下文

    规律1:函数用圆括号调用,函数的上下文是windows对象 所有的全局变量都是windows对象的属性,而函数里面的局部变量,不是windows的属性,不是任何东西的属性,它就是一个变量! 规律2:函 ...

  8. USACO比赛题泛刷

    随时可能弃坑. 因为不知道最近要刷啥所以就决定刷下usaco. 优先级排在学习新算法和打比赛之后. 仅有一句话题解.难一点的可能有代码. 优先级是Gold>Silver.Platinum刷不动. ...

  9. [转载]EXCEL绝对引用中$A$1、A$1、$A1三个的区别?

    转自:https://zhidao.baidu.com/question/167695289.html EXCEL绝对引用中$A$1.A$1.$A1三个的区别? 符号“$”加在不地方的含义有何不同? ...

  10. Spring定时任务@Scheduled注解使用方式

    1.开篇 spring的@Scheduled定时任务相信大家都是十分熟悉.最近在使用过程中发现了一些问题,写篇文章,和大家分享一下.结论在最后,不想看冗长过程的小伙伴可以直接拉到最后看结论. 2.简单 ...