因为公司最近的一个项目,第一次用到了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. QT 添加外部库文件

    LIBS += D:\Code\Opengltest\OpenGL32.Lib D:\Code\Opengltest\GlU32.Lib LIBS += OpenGL32.Lib GlU32.Lib  ...

  2. sql*loader以及oracle外部表加载Date类型列

    Oracle sqlldr LOAD DATAINFILE *INTO TABLE testFIELDS TERMINATED BY X'9'TRAILING NULLCOLS(    c2 &quo ...

  3. opencv检错:程序运行过程正常,当跳出函数时出现断言错误(Debug Assertion Failed)

    转载http://blog.csdn.net/u012327581/article/details/51351780 1.问题描述 在VS2015下配置好Opencv后,程序在函数运行过程中正常,调试 ...

  4. 为input标签绑定事件的几种方式

    为input标签绑定事件的几种方式 1.JavaScript原生态的方式,直接复制下面的代码就会有相应的效果 <!DOCTYPE html><html><head> ...

  5. 【Java基础】浅谈常见设计模式

    Num1:单例模式 基本概念:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 常见写法: 懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值 ...

  6. Jenkins学习

    1.jenkins启动卡在密码初始化处不动的情况,参照: https://blog.csdn.net/lylload/article/details/82754101 https://blog.csd ...

  7. jenkins 配置

    配置: echo " aliyun.oss.access.key=LTAIz4Koeff8sCr8 " > ./src/main/resources/oss.dev.prop ...

  8. 清除控制台 console

    清除控制台 console.log(1) // console.clear() // CTRL + K // Ctrl + L // process.stdout.write('\033c'); // ...

  9. 从事三年java开发后, 我打算转人工智能

    作为一个2015年参加java培训,2016年计算机科学与技术本科毕业后一直从事java开发的程序员来说, 做出这一步真的不容易, 可是我没赶上java最火的时候,反而渐渐感受到了java的没落, 目 ...

  10. mysql基础篇(上篇)

    一.数据库 1.数据库介绍 2.RDBMS专业术语 3.MySQL数据库 4.常用数据库命令 1.数据库介绍 :什么是数据库 数据库就是按照数据结构来组织.存储和管理数据的仓库. 我们常常讲的数据库往 ...