http://topic.csdn.net/u/20090920/15/eff2a6e7-5151-40c8-bf6e-2794570df10d.html?60546
--1、2楼已经是正解? 正解个屁,你多插入一行( 5 5 88 )试试!
--按成绩排名
id name grade
1 2 80
2 2 90
3 3 80
4 4 88
5 5 88--是不是结果应该是:
id name grade rank
1 2 80 3
2 2 90 1
3 3 80 3
4 4 88 2
5 5 88 2--可是你去运行1、2楼的SQL语句看看,看看是不是上面这个结果!
select id,name,grade,(select count(*) from yourTable where grade>a.grade)+1 as rank
from yourTable
order by grade desc;--------My SQL方法一:(Distinct子查询法)--------------------
--优点:不用去定义变量,省事
--缺点:运行效率不如方法二
select id, name, grade, (SELECT count(distinct grade) from tb1 where grade>t1.grade)+1 as rank
from tb1 t1
order by grade desc;--------My SQL方法二:(变量递增法)--------------------------
--优点:速度应该比方法一快
--缺点:在每次运行此查询之前,要定义并初始化为0的变量,用以排名,比较麻烦!
set @rownum=0;select t1.id, t1.name, t1.grade, t2.rank
from tb1 t1 right join (select distinct @rownum:=@rownum+1 as rank, grade from tb1 order by grade desc) t2
on t1.grade=t2.grade
order by t1.id;--------Oracle方法一:(rownum右联接法)----------------------
select t1.id, t1.name, t1.grade, t2.rank
from tb1 t1 left join ( select rownum as rank, grade from (select distinct grade from tb1 order by grade desc)) t2
on t1.grade=t2.grade
order by t1.id
--1、2楼已经是正解? 正解个屁,你多插入一行( 5 5 88 )试试!
--按成绩排名
id name grade
1 2 80
2 2 90
3 3 80
4 4 88
5 5 88--是不是结果应该是:
id name grade rank
1 2 80 3
2 2 90 1
3 3 80 3
4 4 88 2
5 5 88 2--可是你去运行1、2楼的SQL语句看看,看看是不是上面这个结果!
select id,name,grade,(select count(*) from yourTable where grade>a.grade)+1 as rank
from yourTable
order by grade desc;--------My SQL方法一:(Distinct子查询法)--------------------
--优点:不用去定义变量,省事
--缺点:运行效率不如方法二
select id, name, grade, (SELECT count(distinct grade) from tb1 where grade>t1.grade)+1 as rank
from tb1 t1
order by grade desc;--------My SQL方法二:(变量递增法)--------------------------
--优点:速度应该比方法一快
--缺点:在每次运行此查询之前,要定义并初始化为0的变量,用以排名,比较麻烦!
set @rownum=0;select t1.id, t1.name, t1.grade, t2.rank
from tb1 t1 right join (select distinct @rownum:=@rownum+1 as rank, grade from tb1 order by grade desc) t2
on t1.grade=t2.grade
order by t1.id;--------Oracle方法一:(rownum右联接法)----------------------
select t1.id, t1.name, t1.grade, t2.rank
from tb1 t1 left join ( select rownum as rank, grade from (select distinct grade from tb1 order by grade desc)) t2
on t1.grade=t2.grade
order by t1.id
解决方案 »
- mysql 数据恢复的难题
- MYSQL建表外键约束的问题
- csv如何导入 mysql? ACMAIN_CHM 来帮帮忙。。
- Debian安装Mysql5.1,求救~!:-(99999999
- XP能装mysql吗?
- 救急!!!!!!! mysql中如何回滚啊
- MYSQL连接错误
- 新手请教子查询和join查询问题
- 我这么写应该没错把!怎么总提示:Warning: Supplied argument is not a valid MySQL result resource in C:\apache\htdocs\hz\wtnr.php3 on line 5
- MySQL从库启动不起来,求大神指点 谢谢
- postgres中snapshot会不会覆盖数据库中的系统表
- 如何让mysql的DB下面,支持有软链接的文件?
id name grade rank
1 2 80 4
2 2 90 1
3 3 80 4
4 4 88 2
5 5 88 2当然如果客户有要求是按不同的分数排名,这个以前也有人问过,是用count(distinct 来实现, 和你的一样。
所以说, 有时候用例子来说明自己的要求也是一门技巧。你的这个例子则比较清楚,但你所说的那个贴子的提问者具体要哪种则无法预料了。或者是按大部分人的思维按常规方法排名。或者是按你这种排法。
select a1.*,b1.pm1 from pm a1 left join (
select a.grade,count(b.grade) as pm1 from (
SELECT grade from pm group by grade) a
left join
(
SELECT grade from pm group by grade) b
on a.grade<=b.grade group by a.grade) b1 on a1.grade=b1.grade
比如值为不为空
有没有null值
索引的使用情况
与IO的交互等等 考虑全部的话一条sql语句不是那么容易就写出来的 大家都是建议 你只参考 最终还要你修改与测试的
http://topic.csdn.net/u/20090920/15/eff2a6e7-5151-40c8-bf6e-2794570df10d.html?60546原贴是 xxm712 的一个提问,不是楼主的 xxm712 的确没有对这个排名的问题说清楚,所以大家一般都会按照个人的理解和惯例来猜测原题。当然很多少,或者说大部分人会主为,并列第一后,就没有第二名了。其实不存在对与不对,只不过是每个人根据自己的经验,环境所做的猜测。luoyoumou1202 的解法同样也是依据并列第一后,第三个人是第二这种猜测,算法上同样也没有问题。
但个人不赞成,以偏盖全,一种算法的正确,并不代码另一种算法是不对的,关键是大家都是基于猜测。没什么对与不对。关于这个猜测的解释其实已经在另一个贴子中提示了一下,估计 luoyoumou1202 没有看到或者忽略了。http://topic.csdn.net/u/20090921/12/4a6b66dd-c4f3-48ac-98e8-9cb21b0ea626.html[Quote = #17楼] 引用排序结果为:
name grade No
a 80 2
b 90 1
c 70 3
d 70 3
e 80 2
f 80 2
d 90 1
g 90 1这个问题比较常见。关键是用户如何定义这个“排名”的问题。 比如对 80 的前面有两个并列第一的,这个80的是第二,还是第三,要看业务逻辑而定了。 如果80为第二,则可以用 COUNT(DISTINCT) , 但这种排名方式相对比较少见。[/Quote]
有不同见解欢迎讨论,但请注意言辞。