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