mysql查询所有分类前三的数据
设计思路
当mysql查询有很多分类时,可能只需要每种分类的前三或者前十的数据,不需要返回所有的结果,所以我们可以给不同种类的数据添加序号,然后通过序号来筛选结果
例:建一张工人工作质量表,用年份和质量来分类
CREATE TABLE `work` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(32) DEFAULT '' COMMENT '姓名',`years` int(11) DEFAULT 0 COMMENT '年份',`type` varchar(32) DEFAULT '' COMMENT '质量类型: 高 中 低 不合格',`count` int(11) DEFAULT 0 COMMENT '工作量',PRIMARY KEY (`id`),UNIQUE KEY(`name`,`years`,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
给新建的表添加一些数据
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('张三', '高', 2020, 0);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('张三', '中', 2020, 200);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('张三', '低', 2020, 200);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('张三', '不合格', 2020, 600);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('李四', '高', 2020, 800);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('李四', '中', 2020, 100);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('李四', '低', 2020, 50);
INSERT INTO `work` (`name`, `type`, `years`, `count`) VALUES ('李四', '不合格', 2020, 50);
INSERT INTO `work` ( `name`, `type`, `years`, `count`) VALUES( '李四', '高', 2018, 100);
INSERT INTO `work` ( `name`, `type`, `years`, `count`) VALUES( '李四', '中', 2018, 200);
INSERT INTO `work` ( `name`, `type`, `years`, `count`) VALUES( '李四', '低', 2018, 500);
INSERT INTO `work` ( `name`, `type`, `years`, `count`) VALUES( '李四', '不合格', 2018, 200);
查询每人每年工作数量前3的数据
1.直接查询
SELECT name,type,years,count FROM work ORDER BY name DESC,years DESC,count DESC
查询的结果发现有很多是不需要的
name | type | years | count |
---|---|---|---|
李四 | 高 | 2020 | 800 |
李四 | 中 | 2020 | 100 |
李四 | 低 | 2020 | 50 |
李四 | 不合格 | 2020 | 50 |
李四 | 低 | 2018 | 500 |
李四 | 中 | 2018 | 200 |
李四 | 不合格 | 2018 | 200 |
李四 | 高 | 2018 | 100 |
张三 | 不合格 | 2020 | 600 |
张三 | 中 | 2020 | 200 |
张三 | 低 | 2020 | 200 |
张三 | 高 | 2020 | 0 |
2.添加序号筛选查询(通过数值排序添加序号,再将序号大于3的去除)
SELECT name, type, years, count
FROM (
SELECT CASE
WHEN @name = name
AND @years = years THEN @ordinal := @ordinal + 1
ELSE @ordinal := 1
END AS ordinal, @name := name AS name, @years := years AS years
, type, count
FROM (
SELECT name, type, years, count
FROM work, (
SELECT @ordinal := 0, @name := ‘’
, @years := 0
) t1
ORDER BY name DESC, years DESC, count DESC
) t2
) t3
WHERE ordinal <= 3
查询的结果
name | type | years | count |
---|---|---|---|
李四 | 高 | 2020 | 800 |
李四 | 中 | 2020 | 100 |
李四 | 低 | 2020 | 50 |
李四 | 低 | 2018 | 500 |
李四 | 中 | 2018 | 200 |
李四 | 不合格 | 2018 | 200 |
张三 | 不合格 | 2020 | 600 |
张三 | 中 | 2020 | 200 |
张三 | 低 | 2020 | 200 |
mysql查询所有分类前三的数据相关推荐
- MySQL获取每个分类下面的前三条数据
现在项目遇到个问题,我相册图片里面有很多分类,我想取出每个分类下面的前三条数据,应该怎么做呢? 数据结构如下: DROP TABLE IF EXISTS `t_picture`; CREATE TAB ...
- mysql 查询案例dept,emp表内数据
mysql 查询案例dept,emp表内数据 部门表 员工表 工资等级表 查询案例: 部门表 CREATE TABLE DEPT( DEPTNO INT PRIMARY KEY, – 部门编号 DNA ...
- 大数据量 分类统计每个类别的排名前三的数据
需求: 统计每个类别某项数据排名前几的数据 方案: 1.sql统计 2.sql查询出所有的数据,代码 group 分组取出每个类别的前3个数据 3.sql查询每个类别前3数据,union连接起来 4. ...
- Mysql查询某字段值重复的数据个数
说明:表:survey_consumer,字段:province ,统计字段:count 语句说明:查询出survey_consumer表中province字段两个及以上相同的数据(没有重复的数据不会 ...
- Mysql查询各科成绩前三名并分别排序
Mysql查询各科成绩前三名并分别排序 这个问题是之前1个朋友学mysql他们老师布置的作业,一开始我没有做过,而且刚出来做开发很多学过的东西都忘记了. 表结构如下: 一开始我是这样写的: selec ...
- mysql查询总成绩的前3名学生信息
mysql查询总成绩的前3名学生信息 mysql 8.0+版本 mysql8.0下 mysql 8.0+版本 使用窗口函数 mysql8.0下 select id,STATUS,@rank1 :=@r ...
- mysql查询各科成绩前三名的记录,sql查询各科成绩前三名----详述过程,思路清晰不烧脑...
使用mysql.hive查询各科成绩前三名 一.建表造数据 建表: create table scores( name varchar(100), subject varchar(100), scor ...
- mysql查询各科成绩前三名的记录_mysql巧用连表查询各科成绩前三名
下列是各表的详情,不想自己建表的同学可以直接copy code,数据随意. 创建表成绩详情表: CREATE TABLE score ( id int(10) NOT NULL AUTO_INCREM ...
- MySQL 查询最好的前/后3条
MySQL 查询前/后3条 1 查询SQL 2 学生表 3 成绩表 1 查询SQL select a.`subject`,a.score,s.`name` from score a left join ...
最新文章
- python头文件math.h_将常量从.h文件导入到python中
- [转]springmvc常用注解标签详解
- WeihanLi.Npoi 导出支持自定义列内容啦
- JVM对象占用内存计算
- (29)FPGA原语设计(差分时钟转单端时钟)
- 第十一节(单例模式初步、类的继承)
- PATB 1038. 统计同成绩学生(20)
- 如果有一个工具可以帮助你将你的代码可视化,你需要吗?
- C#读IC卡程序(明华读卡器)
- Cocos2dx和Unity3D对比
- steps_per_epoch=2000,epochs=100之间的区别
- 5G技术发展的发展现状,未来发展有哪些关键点和趋势
- JQ对复选框全选、获取复选框的值、回选
- 从“老婆”到“俞渝”,李国庆5377条微博透露出了多少秘密?
- 深圳市区块链电子发票系统累计开票超5800万张
- Web(前端开发)结合html、css、js写一个简单的相册
- NoneBot2,基于Python的聊天机器人
- 杭州富阳科目三:考试笔记
- css复杂的背景图案(网格、波点、棋盘)
- 云上中国年,阿里云CDN猪年春节高峰流量再创新高
热门文章
- 关于奇迹私服发布站程序的使用说明
- Linux烤机脚本测试io,烤机轻松压到56度!RTX3060 iCraft OC评测
- Topaz Gigapixel AI 5.3.1 智能图像无损放大软件汉化版
- 关于solidworksPDM插件的制作
- 量化分析(8)——唐安奇通道
- Django框架(五) 用户名密码登录
- 我的博客今天3岁92天了,我领取了精英博主徽章_亮仔_新浪博客
- 【洛谷】【P1010题解】 [NOIP1998 普及组] 幂次方
- Django-MTV模型
- 论文笔记 | China‘s Closed Pyramidal Managerial Labor Market