因为公司最近的一个项目,第一次用到了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. ie8下new Date()指定时间

    项目开发中很可能会需要创建一个指定日期的时间对象,火狐浏览器可以直接使用new Date('yyyy-mm-dd')生成时间,但是在ie8下就会发现生成的时间输出的是NaN-NaN-NaN.为了兼容可 ...

  2. Centos7通过SSH使用密钥实现免密登录

    日常开发中,难免会有登录服务器的操作,而通过ssh方式登录无疑是比较方便的一种方式. 如果登录较频繁,使用密钥实现免密登录无疑更是方便中的方便.因此本文就简单说一说如何实现免密登录. 一.安装配置ss ...

  3. BZOJ-3208|记忆化搜索-花神的秒题计划Ⅰ

    背景[backboard]: Memphis等一群蒟蒻出题中,花神凑过来秒题-- 描述[discribe]: 花花山峰峦起伏,峰顶常年被雪,Memphis打算帮花花山风景区的人员开发一个滑雪项目. 我 ...

  4. Python打开新世界的大门-入门篇1

    目录 题记 Python技巧.避坑及心得 八种数据类型 循环 函数 Homework 题外话 之前没有写博客的习惯,现在开始写觉得入门也太晚了吧,看看同龄的大哥都写了十几万字.于是 ...

  5. js原型和原型链理解到面向对象

    一.js中的两种对象,普通对象和函数对象 var obj1 = {}; var obj2 =new Object(); var obj3 = new obj1(); function fun1(){} ...

  6. 廖雪峰 JavaScript 学习笔记(函数)

    JavaScript中,定义函数的方式如下: function abs(x) { if (x >= 0) { return x; } else { return -x; } } 上述abs()函 ...

  7. IDEA Maven项目的Mybatis逆向工程

    IDEA Maven项目的Mybatis逆向工程 1.配置.pom 如果是在多模块开发下,该文件逆向工程要生成的那个模块下的pom文件. <build> <plugins> & ...

  8. HBase详解

    1.   hbase简介 1.1.  什么是hbase HBASE是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统,利用HBASE技术可在廉价PC Server上搭建起大规模结构化存储集群. H ...

  9. MySQL 存储过程错误处理

    MySQL  存储过程错误处理 如何使用MySQL处理程序来处理在存储过程中遇到的异常或错误. 当存储过程中发生错误时,重要的是适当处理它,例如:继续或退出当前代码块的执行,并发出有意义的错误消息. ...

  10. git与github工具使用

    这篇文章主要的目标是用较少的时间学习Git和GitHub的基本使用.在足够一般使用的前提下,尽量减少命令.如果需要其他命令,到时候再去其他地方了解就行了. 总概:所有命令前都要加 git,如下的ini ...