MySQL GROUP_CONCAT函数使用示例:如何用一个SQL查询出一个班级各个学科第N名是谁?
如何用一个SQL查询出一个班级各个学科第N名是谁?
首先贴出建表语句,方便大家本地测试:
-- 建表语句
CREATE TABLE score (
id INT NOT NULL auto_increment,
`name` VARCHAR (20) NOT NULL DEFAULT '' COMMENT '姓名',
sub VARCHAR (20) NOT NULL DEFAULT '' COMMENT '学科',
score INT NOT NULL DEFAULT 0 COMMENT '分数',
PRIMARY KEY (id)
); INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('1', '麻子', '语文', '85');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('2', '王二', '语文', '99');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('3', '张三', '语文', '76');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('4', '李四', '语文', '96');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('5', '学霸', '语文', '100');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('6', '麻子', '数学', '66');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('7', '王二', '数学', '88');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('8', '张三', '数学', '99');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('9', '李四', '数学', '33');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('10', '学霸', '数学', '100');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('11', '麻子', '英语', '98');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('12', '王二', '英语', '99');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('13', '张三', '英语', '60');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('14', '李四', '英语', '59');
INSERT INTO `score` (`id`, `name`, `sub`, `score`) VALUES ('15', '学霸', '英语', '100');
我自己想出的一个sql方案,用到了GROUP_CONCAT和SUBSTRIlNG_INDEX两个函数:
-- SQL
SET @rank = 3;
SELECT
s.sub,
s.`name`,
s.score
FROM
(
SELECT
sub,
SUBSTRING_INDEX(
SUBSTRING_INDEX(
GROUP_CONCAT(score ORDER BY score DESC),
',',
@rank
),
',' ,- 1
) AS score
FROM
score
GROUP BY
sub
) AS t
LEFT JOIN score AS s ON (
s.sub = t.sub
AND s.score = t.score
GROUP_CONCAT的官方解释:
This function returns a string result with the concatenated non-NULL values from a group. It returns NULL if there are no non-NULL values. The full syntax is as follows:
GROUP_CONCAT([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[SEPARATOR str_val])
In MySQL, you can get the concatenated values of expression combinations. To eliminate duplicate values, use the DISTINCT clause. To sort values in the result, use the ORDER BY clause. To sort in reverse order, add the DESC (descending) keyword to the name of the column you are sorting by in the ORDER BY clause. The default is ascending order; this may be specified explicitly using the ASC keyword. The default separator between values in a group is comma (“,”). To specify a separator explicitly, use SEPARATOR followed by the string literal value that should be inserted between group values. To eliminate the separator altogether, specify SEPARATOR ''.
有其他方法的,大家可以一起讨论。
MySQL GROUP_CONCAT函数使用示例:如何用一个SQL查询出一个班级各个学科第N名是谁?的更多相关文章
- 一个SQL查询出每门课程的成绩都大于80的学生姓名
name kecheng fenshu 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 ...
- SQL查询出一个表数据插入到另一个表里
下面两中方式都是将 srcTbl 的数据插入到 destTbl,但两句又有区别的: 方式一 (select into from)要求目标表(destTbl)不存在,因为在插入时会自动创建. selec ...
- mysql GROUP_CONCAT 函数 将相同的键的多个单元格合并到一个单元格
mysql GROUP_CONCAT 函数 将相同的键的多个单元格合并到一个单元格 MemberID MemberName FruitName -------------- ------------- ...
- 教您如何使用MySQL group_concat函数
MySQL group_concat函数是典型的字符串连接函数,下面就为您介绍MySQL group_concat的语法,希望对您学习MySQL group_concat函数有所帮助. MySQL g ...
- Mysql group_concat函数被截断的问题
mysql group_concat函数被截断的问题 MySQL的 group_concat 函数默认返回1024个字节长度,超过长度的会被截断.最近程序中就遇到这个问题了. 通过如下命令可以查看 ...
- Struts2自定义标签2自定义一个按班级id查询出该班级下的学生,存放进值栈,并遍历出来。
Struts2自定义标签的流程概念: (1)需要两个类:标签类(继承相应的tag类),基本类(继承Component).标签类专门负责从客户端取得用户输入的一些属性,这个普通的jsp自定义标签一样,取 ...
- MySQL GROUP_CONCAT()函数 -- 字段合并查询
在做查询的时候遇到一个问题,今天分享一下解决方法. 先看一下我想要什么效果. 清单名称类型要点,后面两列为清单步骤(外键表) 但我并不想让主表的内容重复那么多遍,于是 distinct去重.子查询.左 ...
- mysql—group_concat函数
MySQL中的group_concat函数的使用方法,比如select group_concat(name) . 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Or ...
- mysql group_concat函数是有长度限制的
在表关联查询中,特别是一对多关系的表查询中,group_concat函数是很有用的一个函数,帮助我们减少对数据库查询的次数,减少服务器的压力. 但是今天使用group_concat函数查询数据库时,发 ...
随机推荐
- MVC学习系列11---验证系列之客户端验证
前面学习了,服务端验证,这篇文章中,我们接着学习客户端验证,客户端的验证,使用Jquery和Jquery插件来实现[jquery.validate.min.js and jquery.validate ...
- Not a git repository (or any of the parent directories): .git
今天准备在win10上面安装git,想把代码发布到github中,按照教程的方法一步一步下来,当配置完ssh和用户名,邮箱之后,发现下拉不下来github中的代码,出现如下错误. 说是没有发现仓储,很 ...
- ASP.NET MVC 模块与组件(一)——发送邮件
我的见解: 模块化与组件化是编程的一种思想:提高代码的重用性,提高开发效率. 常见的模块化就是函数与各种类型的封装,若是代码具有更高的重用价值(能够提供给别人使用),建议可以考虑封装成动态链接库(dl ...
- Maven学习随笔一——Maven安装报错处理(mvn -v, 提示不是内部命令的问题)
今天心血来潮学习maven,可是光安装就花了个把小时,好坑有木有! 安装过程可百度,各种经贴,不详. 控制台输入 mvn -v ,如果报错,很可能是你的java/maven的环境变量配置出了点问题: ...
- Effective c++读书笔记
1.视C++为一个语言联邦 C.object-oriented C++.template C++.STL 2.尽可能使用const: 1)关键字const出现的星号左边,表示被指物事常 ...
- TouchPoint.js – 可视化展示 HTML 原型点击效果
TouchPoint.js 是一个用于 HTML 原型展示的 JavaScript 库(作为UX过程的一部分),通过视觉表现用户在屏幕上的点击.TouchPoint 是高度可定制,非常适合屏幕录制,用 ...
- 纯CSS打造好看的按钮样式
好看的按钮.链接.div样式,效果预览: http://hovertree.com/code/run/css/s8o19792.html 发现今天积分和排名不错: 代码如下: <!DOCTYPE ...
- javascript中的弹框
大家都见过某度中的恶意广告,你关闭了又出来了!为何,JS来告诉你 效果猛戳此处 HTML <body> <h3 class="whiteColor">无法关 ...
- String类型的属性和方法
× 目录 [1]属性 [2]对象通用方法 [3]访问字符方法[4]字符串拼接[5]创建子串方法[6]大小写转换[7]查找子串位置[8]正则匹配方法[9]去除首尾空格[10]字符串比较 前面的话 前面已 ...
- UIScrollView出现位移问题
啦啦啦啦啦~~~ UINavigationController和UIScrollView一起使用时会导致UIScrollView位置偏移 情况:UINavigationController的视图上的第 ...