因为公司最近的一个项目,第一次用到了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. java0426 wen IO2

  2. C 语言多线程与锁机制

    C 语言多线程与锁机制 多线程 #include <pthread.h> void *TrainModelThread(void *id) { ... pthread_exit(NULL) ...

  3. 提高组noip2015

    一道二分答案裸题,一道dp,一道各种裸题的混合(树上差分+二分答案+LCA) stone: 二分查找裸题啊: int check(int x) { ,last=; ;i<=n;i++) if(a ...

  4. Java包装类介绍与类型之间相互转换

    1.包装类存在的意义 通俗解释就是由于Java是面对对象的语言,而基本类型不具有面对对象的概念,为了弥补不足,引入了包装类方便使用面对对象的变成思想操作基本类型. 2.基本类型和包装类对应关系 byt ...

  5. Python连接MySQL数据库之pymysql模块

    pymysql 在python3.x 中用于连接MySQL服务器的一个库:Python2中则使用mysqldb pymysql的模块的基本的使用 # 导入pymysql模块 import pymysq ...

  6. 那些按烂的Linux命令集合贴

    #查看80端口运行情况netstat -anp|grep 80 #关闭某个进程(如8848pid) kill -9 8848 #运行java的war包 java -jar myproj.war #持续 ...

  7. 后台获取POST方式提交的JSON格式数据

    1.直接使用request.getParamater()的方法获取(这种取参方式对于POST和GET的提交方式均适用): 2.通过请求体的IO流获取参数(这种方式只能用于POST,因为GET方式没有请 ...

  8. CentOS7.5 下搭建SFTP

    CentOS7.5 下搭建SFTP Linux 创建用户组 groupadd sftp 创建用户test useradd -G sftp -s /sbin/nologin test -s 禁止用户ss ...

  9. 2019 ICPC南昌邀请赛 网络赛 K. MORE XOR

    说明 \(\oplus x​\)为累异或 $ x^{\oplus(a)}​$为异或幂 题意&解法 题库链接 $ f(l,r)=\oplus_{i=l}^{r} a[i]$ $ g(l,r)=\ ...

  10. 基于Ocelot的gRpcHttp网关

    什么是gRpcHttp网关 通俗的讲就是将gRpc提供的服务以rest api的形式提供出去,不需要再单独的写一个webapi去做这件事. gRpcHttp网关好处 减少不必要代码,减少中间层提高通讯 ...