您的位置:首页 > 数据库 > MySQL

MySQL之分组选择数据

2017-10-31 14:16 274 查看
/*用到的表*/
DROP TABLE IF EXISTS `friends`;/*悟空朋友表*/
CREATE TABLE `friends` (
`id` int(3) NOT NULL,/*sql server中不能指定int长度*/
`user_name` varchar(30) default NULL,
`type` varchar(30) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `friends` VALUES ('1', '孙悟空', 'friends');
INSERT INTO `friends` VALUES ('2', '牛魔王', 'friends');
INSERT INTO `friends` VALUES ('3', '蛟魔王', 'friends');
INSERT INTO `friends` VALUES ('4', '鹏魔王', 'friends');
INSERT INTO `friends` VALUES ('5', '狮驼王', 'friends');

DROP TABLE IF EXISTS `qujing`;/*取经表*/
CREATE TABLE `qujing` (
`id` int(3) NOT NULL,
`user_name` varchar(30) default NULL,
`type` varchar(30) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `qujing` VALUES ('1', '唐僧', 'qujing');
INSERT INTO `qujing` VALUES ('2', '猪八戒', 'qujing');
INSERT INTO `qujing` VALUES ('3', '孙悟空', 'qujing');
INSERT INTO `qujing` VALUES ('4', '沙僧', 'qujing');


分组查询:选出每组前两名

select d.user_name ,c.timestr,kills
from(
select user_id,timestr,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,timestr,kills
) c  join user1 d on c.user_id=d.id
where cnt<=2


每个人杀怪最多的前两个日期

select  a.user_name,b.timestr,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中不支持ROW_NUMBER()函数

with  tmp  as(
select  a.user_name,b.timestr,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;


在MySQL中报错,而在SQLServer或Oracle中是可以这样做的

优化方式1:采用ROE_NUMBER函数,进行分区排序

优化方式2:

select  d.user_name,c.timestr,kills  from(select  user_id,timestr,kills,(select  count(*) from user_kills b  where b.user_name =a.user_id  and a.kills <=b.kills) as  cnt   from user_kills a group by user_id,timestr,kills ) c join user1 d on c.user_id=d.id  where  cnt<=2;


参考视频:http://www.imooc.com/learn/398
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql