MySQL_ mysql 不用 order by 实现 第K大 功能

 

mysql 竟然可以不用 order by 就能实现第 K 大的功能,这是怎么实现的呢?本文将讲述 如何 不用 order by 实现 第 k大数 的功能。

 

首先,我们构建一张表,只存储了 用户 id   与 年龄 age .

 

建表语句如下:

CREATE TABLE `sc` (
  `id` int(11) DEFAULT NULL,
  `score` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk

插入的数据如下:

-- ----------------------------
-- Records of sc
-- ----------------------------
INSERT INTO `sc` VALUES ('1', '43');
INSERT INTO `sc` VALUES ('2', '30');
INSERT INTO `sc` VALUES ('3', '86');
INSERT INTO `sc` VALUES ('4', '66');
INSERT INTO `sc` VALUES ('5', '25');
INSERT INTO `sc` VALUES ('6', '46');
INSERT INTO `sc` VALUES ('7', '77');

 

思路:

   因为不能使用 order by 对 数据排序,这里我们考虑的方法是 根据 id 分组,求出有多少个数据 小于等于 当前值。则为当前id的排名。

 

SQL 如下:

SELECT
	s2.id,
	s2.score,
	COUNT(*) myrank
FROM
	sc s2,
	(SELECT score FROM sc) s3
WHERE
	s2.score <= s3.score  
GROUP BY s2.id

 

查询结果:

id   score  myrank

1    43    5
2    30    6
3    86    1
4    66    3
5    25    7
6    46    4
7    77    2

 

求第2名

select id, max(score) ma 

from sc 

where score < (select max(score) from sc )

 

求第N名

 

查询第3名,因为已经按照 group by 统计过排名,我们只需要用 having 对数据过滤即可 :

下面是求第三名的SQL 

SELECT
	s2.id,
	s2.score,
	COUNT(*) myrank
FROM
	sc s2,
	(SELECT score FROM sc) s3
WHERE
	s2.score <= s3.score  
GROUP BY s2.id
HAVING myrank = 3

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值