当前位置: 首页 > news >正文

MySQL 究极奥义·动态乾坤大挪移·无敌行列转换术

导入大SQL文件

[mysqld]
# 大批量导入优化
bulk_insert_buffer_size=1G
max_allowed_packet=1G
innodb_autoextend_increment=512M
innodb_buffer_pool_size=4G
innodb_log_buffer_size=4G
innodb_log_file_size=4G

动态行列转换

DROP TABLE IF EXISTS tb_score;CREATE TABLE tb_score(id INT(11) NOT NULL auto_increment,userid VARCHAR(20) NOT NULL COMMENT '用户id',subject VARCHAR(20) COMMENT '科目',score DOUBLE COMMENT '成绩',PRIMARY KEY(id)
)ENGINE = INNODB DEFAULT CHARSET = utf8;
INSERT INTO tb_score(userid,subject,score) VALUES ('001','语文',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','数学',92);
INSERT INTO tb_score(userid,subject,score) VALUES ('001','英语',80);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','语文',88);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','数学',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('002','英语',75.5);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','语文',70);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','数学',85);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','英语',90);
INSERT INTO tb_score(userid,subject,score) VALUES ('003','政治',82);
select * from test.tb_score;selectuserid,sum(if(subject='语文', score, 0)) as '语文',sum(if(subject='数学', score, 0)) as '数学',sum(if(subject='英语', score, 0)) as '英语'
from test.tb_score
group by userid;SET @EE='';
select @EE :=CONCAT(@EE,'sum(if(subject= \'',subject,'\',score,0)) as ',subject, ',') AS aa FROM (SELECT DISTINCT subject FROM tb_score) A ;SET @QQ = CONCAT('select ifnull(userid,\'TOTAL\')as userid,',@EE,' sum(score) as TOTAL from tb_score group by userid WITH ROLLUP');
-- SELECT @QQ;PREPARE stmt FROM @QQ;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

递归
开发中经常会遇到树形结构,例如菜单、分类等,我们通常需要在代码中使用递归的方式组织树形数据。
现在有一张课程分类表,需要查询给定分类的所有子分类。
课程表如下:

create table course_category
(id       varchar(20)             not null comment '主键'primary key,name     varchar(32)             not null comment '分类名称',label    varchar(32)             null comment '分类标签默认和名称一样',parentid varchar(20) default '0' not null comment '父结点id(第一级的父节点是0,自关联字段id)',is_show  tinyint                 null comment '是否显示',orderby  int                     null comment '排序字段'
)comment '课程分类' charset = utf8;
  1. 现在系统中最多只有三级分类,可以直接进行两次表关联实现。
select a.name, b.name, c.name
from course_category ajoin course_category b on a.id = b.parentidjoin course_category c on b.id = c.parentid
where a.id = '1';
  1. 使用Mysql递归语法。
    上面的方法显然不够通用,随着分类层级的变化SQL也需要更改,在Mysql 8.0中提供了递归语法,轻松实现树形结构的查询。
with recursive t1 as (-- 递归的上下文变量select 1 as nunion all-- 递归的查询,每次递归都会基于该sql的结果继续,直到where条件不满足停止递归。select n + 1 from t1 where n < 5
)
select * from t1;

执行上面的sql将会得到:

n
1
2
3
4
5

想要查询id='1’的分类(根节点)下所有的子分类的SQL如下:

with recursive t1 as (select * from course_category where id = '1'union allselect a.* from course_category a join t1 on t1.id = a.parentid
)
select * from t1;

相关文章:

  • 二维码识别深度解析
  • Python爬虫实战:研究RQ库相关技术
  • 【 (MCMC算法)“马尔可夫链 + 蒙特卡洛 = 黑科技采样术”| 零基础也能学懂!】
  • 逆向入门(5)程序逆向篇-AD_CM#2
  • 【八股消消乐】构建微服务架构体系—实现制作库与线上库分离
  • 再参数化视角下的批量归一化:缩放平移操作的本质意义
  • python与java的区别
  • Appium + Ruby 测试全流程
  • Java线程转储:快速定位死锁与阻塞
  • Kubernetes镜像拉取认证指南
  • BeckHoff PLC --> 料筐(KLT Box)自动对中与抓取程序分析
  • 从检索到生成:RAG 如何重构大模型的知识边界?
  • 【无标题】二维势能塌陷的拓扑色动力学:数学物理框架与引力本质探索
  • 通达信腾龙凤舞幅图指标公式
  • 【算法篇】逐步理解动态规划模型7(两个数组dp问题)
  • 高效录屏工具推荐:从系统自带到专业进阶
  • leetcode 2566. 替换一个数字后的最大差值 简单
  • Relook:softmax函数
  • python第52天打卡
  • Anylogic中使用Python执行3(求和)
  • 3d效果图制作软件/兰州网络推广优化服务
  • 重庆做网站优化推广的公司/站长seo软件
  • 做网站的硬件/代刷网站推广链接免费
  • 网站开发完后部署到网上/做网站的公司有哪些
  • java做网站用的是什么/软文范例大全
  • 个人网站 组建/上海百度seo牛巨微