问题:如何查询出四人组中打怪最多的日期?
使用 JOIN 优化聚合子查询
引入一张新表,按日期记录四人组中每个人打怪的数量
使用join优化聚合子查询
1)、having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录
聚合子查询
查询打怪最多的日期
select a.user_name,b.timestr,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);
优化后:
select a.user_name,b.timestr,b.kills from user1 a join user_kills b ON a.id=b.user_id
join user_kills b ON c.user_id=b.user_id
group by a.user_name,b.timestr,b.kills having b.kills=max(c.kills);
join 聚合查询
插入新表
避免子查询:
使用JOIN聚合子查询:
用join 优化聚合子查询
mysql> select a.username,b.kills from tbuser1 a
-> join tbuser2 b on a.id=b.username
-> join tbuser2 c on c.username=b.username
-> group by a.username,b.kills
-> having b.kills=max(c.kills);
用join优化连表更新;
update tbuser2 a join tbuser1 b on a.username=b.username set a.username=b.id;
使用join语句优化子查询
如何查询出打怪四人组中打怪最多的日期?
使用子查询语句:
select a.user_name,b.timestr,b.kills from user1 as a left join user_kills as b on a.id = b.user_id where b.kills = (select max(c.kills) from user_kills as c where b.user_id = c.user_id);
在子查询中添加 b.user_id = c.user_id 目的在于 在 “悟空”“八戒”“沙僧”中分组取出最大值,若是直接删除的话,只能在所有数据中取出最大值。
2. 优化使用join 语句
select a.user_name , b.timestr , b.kills from user1 a join user_kills b on a.id = b.user_id join user_kills c on c.user_id = b.user_id group by a.user_name , b.timestr , b.kills having b.kills = MAX(c.kills)
?
join 优化聚合子查询
该课程可以学习2-7和2-8来了解join的应用
含义:找出c列的最大值,对应到b列的日期。
1、使用子查询
select a.user_name,b.timestr,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)
2、使用join避免子查询
select a.user_name,b.timestr,b.kills
from user1 a
join user_kills b on a.id=b.user_id
join user_kills c on c.user_id = b.user_id
group by a.user_name,b.timestr,b,kills
having b.kills=max(c.kills)
优化聚合子查询
select a.user_name,b.timerstr,.b.kills from user user1 a Join user_kills b on a.id=b.userid where
b.kills(select Max(c.kills) from user_kills c where c.user_id=b.user_id)
where 后边进行聚合查询
join优化聚合子查询
聚合子查询
@MySQL---JOIN优化聚合子查询
1.一般写法,未能解决
SELECT g.user_name,MAX(k.kills),k.time FROM `group` AS g JOIN kills AS k ON g.id=k.user_id GROUP BY g.user_name ORDER BY g.user_name;
2.使用JOIN优化聚合子查询
SELECT a.user_name,b.timestr,b.kills FROM user1 a JOIN user_kills b ON a.id = b.user_id JOIN user_kills c ON c.user_id = b.user_id GROUP BY a.user_name,b.timestr,b.kills HAVING b.kills = MAX(c.kills);
使用join和having避免重复查询
SELECT g.user_name,MAX(k.kills),k.time FROM `group` AS g JOIN kills AS k ON g.id=k.user_id GROUP BY g.user_name ORDER BY g.user_name;
SELECT g.user_name,k.kills,k.time FROM `group` AS g JOIN kills AS k ON g.id=k.user_id JOIN kills AS k1 ON g.id=k1.user_id GROUP BY g.user_name,k.kills HAVING k.kills=MAX(k1.kills) ORDER BY k.kills;