因为公司最近的一个项目,第一次用到了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线程学习之volatile关键字

    volatile变量的主要作用:是使变量在多个线程间可见. 在java中每一个线程都会有一块工作内存区,其中存放着所有线程共享的主内存的变量值的拷贝.当线程执行时,它在自己的工作内存区操作这些变量,为 ...

  2. ltp-ddt emmc_dd_rw

    emmc_dd_rw EMMC_M_FUNC_DD_RW_500M source "common.sh"; install_modules.sh "emmc"; ...

  3. bzoj 4767 两双手 - 动态规划 - 容斥原理

    题目传送门 传送门I 传送门II 题目大意 一个无限大的棋盘上有一只马,设马在某个时刻的位置为$(x, y)$, 每次移动可以将马移动到$(x + A_x, y + A_y)$或者$(x + B_x, ...

  4. jQuary学习の四の遍历

    向上遍历DOM树: parent():返回被选元素的直接父元素 parents():返回被选元素的所有祖先元素(当后边参数存在时则表示其中与参数相同的祖先元素) parentsUntil()返回介于两 ...

  5. hiho#1513 : 小Hi的烦恼 五维偏序

    hiho#1513 : 小Hi的烦恼 五维偏序 链接 hiho 思路 高维偏序用bitset,复杂度\((\frac{n^2}{32})\) 代码 #include <bits/stdc++.h ...

  6. 论文阅读: Siam FC

    一.研究动机 一方面传统算法设计的跟踪模型过于简单,另一方面深度学习方法很难达到实时效果然而现实场景中的应用对速度要求较高. "shallow method"(HCFT)没有很好地 ...

  7. vue-cli 最强指南

    今天在这篇文章里,会对 vue-cli 的功能做个详细的整理,把 vue-cli 所有的功能都列出来.注:这个是官网连接:https://cli.vuejs.org/zh/guide/ ,建议多看细看 ...

  8. [爬虫进阶]使用Jsoup取代你的一切网络请求方法(java,post,get,代理IP)

    [爬虫进阶]使用Jsoup取代你的一切网络请求方法(java,post,get,代理IP) 原文链接:https://www.cnblogs.com/blog5277/p/9334560.html 原 ...

  9. Hadoop之HDFS的Shell操作

    1.基本语法 bin/hadoop fs 具体命令 或者 bin/hdfs dfs 具体命令 dfs 是 fs 的实现类. 2.命令大全 [hadoop@hadoop102 hadoop-]$ bin ...

  10. Mysql 索引之B+tree

    InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶 ...