2 Star 0 Fork 0

wscaco3 / mysql_tech

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
joinxiang_guan_ji_qiao.md 2.59 KB
一键复制 编辑 原始数据 按行查看 历史
wscaco3 提交于 2015-11-18 16:22 . Update joinxiang_guan_ji_qiao.md

join相关技巧

更新使用过滤条件中包括自身的表

情景:把同时存在与取经四人组和悟空兄弟表中记录的人在取经四人组表中的over字段更新为“齐天大圣”

UPDATE user1 a JOIN 
(SELECT b.user_name FROM user1 a JOIN user2 b ON a.user_name = b.user_name) c 
ON a.user_name = c.user_name 
SET a.over='齐天大圣';

使用jion优化子查询

因为用到了子查询,效率低效率

select a.user_name,a.over,(select over from user2 b where a.user_name = b.user_name) as over2 from user1 a;

jion优化后

select a.user_name,a.over,b.over as over2 from user1 a left join user2 b on a.user_name = b.user_name;

使用join优化聚合查询

情景:如何查询出四人组中打怪最多的日期?

select a.user_name,b.killday,b.kills from user1 a join user_kills b on a.id = b.user_id
where b.kills = (select max(c.kills) from user_kills c where c.user_id = b.user_id);

jion优化后

select a.user_name,b.killday,b.kills from user1 a 
join user_kills b on a.id = b.user_id
join user_kills c on b.user_id = c.user_id
group by a.user_name,b.killday,b.kills having b.kills = max(c.kills);

实现分组选择

每个人杀怪最多的前两天

select a.user_name,b.killday,b.kills from user1 a 
join user_kills b on a.id = b.user_id
where user_name ='孙悟空' 
order by b.kills desc limit 2;

select a.user_name,b.killday,b.kills from user1 a 
join user_kills b on a.id = b.user_id
where user_name ='猪八戒' 
order by b.kills desc limit 2;

select a.user_name,b.killday,b.kills from user1 a 
join user_kills b on a.id = b.user_id
where user_name ='沙僧' 
order by b.kills desc limit 2;

问题:

  • 如果分类或是用户很多的情况下则需要多次执行同一查询
  • 增加应用程序同数据库的交互次数
  • 增加了数据库执行查询的次数,不符合批处理的规则
  • 增加了网络的流量

优化方式一mysql不支持

with tmp as 
(select a.user_name,b.killday,b.kills,row_number() over 
    (partition by a.user_name order by b.kills) cnt 
from user1 a join user_kills b on a.id = b.user_id)
select * from tmp where cnt <=2;

优化方式二

select d.user_name,c.killday,kills 
from (select user_id,killday,kills,
    (select count(*) from user_kills b where b.user_id = a.user_id and a.kills <= b.kills) as cnt
    from user_kills a group by user_id,killday,kills ) c
join user1 d on c.user_id = d.id 
where cnt <= 2;
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/wscaco3/mysql_tech.git
git@gitee.com:wscaco3/mysql_tech.git
wscaco3
mysql_tech
mysql_tech
master

搜索帮助

344bd9b3 5694891 D2dac590 5694891