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 的 find_in_set函数使用方法,【根据用户选择的文章分类类型去匹配文章数据】
- mysql 分组 链接表 筛选数据。。。。。
- MySQL 中数据的检索(三:数据分组)
- 在mysql中使用group by和order by取每个分组中日期最大一行数据,亲测有效
- 原生mysql查询,选择数据库,建立连接及查询数据表PHP完整流程
- mysql 数据类型的选择
- Mysql 建表 数据类型选择
- Mysql按小时,按日,按周,按月,按季度,按年分组统计数据
- 选择合适的 MySQL 布尔数据类型
- 使用mysql的C API从数据库选择数据
- MySql按周,按月,按日分组统计数据
- mysql 选择优化的数据类型
- MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)
- mysql选择月份查询该月有付款的数据(间隔x月并提前5天付款)
- Mysql选择合适的数据类型
- [摘抄]MySQL分组后获取每个分组下的4笔数据
- MySql按周,按月,按日分组统计数据
- MySQL之选择字段数据类型
- MySQL分组数据
- MySQL中char与varchar数据类型选择原则