注:很有用的sql,在一些新闻类、电子商务类网站中用的比较多。
结构为
user scores
1 80
2 7
3 99
4 58
..
比如我想计算user=4在此表中的排名应该如何做?
复制代码 代码如下:
SELECT COUNT( * ) FROM user_test WHERE scores >= ( SELECT scores FROM user_test
WHERE user =4 )
--参数说明:
--sc 表名
--name 人名
--mark 分数
--ord 名次
1、并列,有空档,名次是不连续的(有两个第二名,接下来的就是第四名)。
复制代码 代码如下:
update sc set ord=(select count(*)+1 from sc B where B.mark>sc.mark)
说明:其实就是求出分数比他多的人数,再加上1。
2、并列,无空档,名次总是连续的
复制代码 代码如下:
update sc set ord=(select count(*) from (select distinct mark from sc) as distmark where distmark.mark >=sc.mark)
说明:select distinct mark from sc 是求出不重复的分数,然后看你的分数排在哪个位置。
--1. 名次生成方式1,Score重复时合并名次
复制代码 代码如下:
SELECT *,Place=(SELECT COUNT(DISTINCT Score) FROM tb WHERE Score>=a.Score)
FROM tb a
ORDER BY Place
/*--结果
Name Score Place
---------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 3
ff 76.00 4
bb 56.00 5
cc 56.00 5
ff 50.00 6
--*/
--2. 名次生成方式2,Score重复时保留名次空缺
复制代码 代码如下:
SELECT *,Place=(SELECT COUNT(Score) FROM tb WHERE Score>a.Score)+1
FROM tb a
ORDER BY Place
/*--结果
Name Score Place
--------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 4
ff 76.00 5
bb 56.00 6
cc 56.00 6
ff 50.00 8
--*/