关于排名次的SQL难题

一张表内有一个字段a,记录了从0-100的整数,现要根据a来排名次。
注意:如果数值相同的,应该是相同的名次。

如:

id a
1 2
2 5
3 5
4 6
5 3

排名次的结果应该是

名次 id a
1 4 6
2 2 5
2 3 5
4 5 3
5 1 2

这样的SQL语句怎么写最好呢?最好用mysql语法
---------------------------------------------------------------

这个问题的确有难度,
1、需要产生递增的编号用来表示名次
2、相同的数值要有相同的名次
3、本来一个select * from table order by a desc取出后用程序循环产生名次即可。但楼主要求使用mysql语句完成

MYSQL:先建表、插入数据
CREATE TABLE test4 (
id tinyint(4) NOT NULL auto_increment,
a tinyint(4) NOT NULL default '0',
UNIQUE KEY id (id)
) TYPE=MyISAM;

INSERT INTO test4 VALUES (1, 2);
INSERT INTO test4 VALUES (2, 6);
INSERT INTO test4 VALUES (3, 4);
INSERT INTO test4 VALUES (4, 9);
INSERT INTO test4 VALUES (5, 5);
INSERT INTO test4 VALUES (6, 0);
INSERT INTO test4 VALUES (7, 6);
INSERT INTO test4 VALUES (8, 5);
INSERT INTO test4 VALUES (9, 0);

DROP TABLE testtemp; # 删除临时表
CREATE TABLE testtemp ( # 创建临时表
id tinyint(4) NOT NULL auto_increment,
a tinyint(4) NOT NULL default '0',
UNIQUE KEY id (id)
) TYPE=MyISAM;
insert into testtemp select DISTINCT '',a from test4 order by a desc; # 向临时表插入不重复数据数据,利用自增字段产生编号
select b.id as level,a.id,a.a from test4 a,testtemp b where a.a=b.a; # 连接两表产生输出

PHP:

 1   
 2$sql = array(   
 3"DROP TABLE testtemp",   
 4"CREATE TABLE testtemp (   
 5id tinyint(4) NOT NULL auto_increment,   
 6a tinyint(4) NOT NULL default '0',   
 7UNIQUE KEY id (id)   
 8) TYPE=MyISAM;   
 9",   
10"insert into testtemp select DISTINCT '',a from test4 order by a desc",   
11"select b.id as level,a.id,a.a from test4 a,testtemp b where a.a=b.a"   
12);   
13  
14$conn = mysql_connect();   
15mysql_select_db("test");   
16  
17foreach($sql as $v)   
18$rs = mysql_query($v);   
19mysql_result_all($rs);   
20  
21/** 仿odbc_result_all函数 **/   
22function mysql_result_all($result,$format="") {   
23echo "

<table $format=""><tr>";
for($i=0;$i<mysql_num_fields($result);$i++) "<th="" echo="" {="">".mysql_field_name($result,$i)."";
}
echo "</mysql_num_fields($result);$i++)></tr>";
while($row = mysql_fetch_row($result)) {
echo "";
for($i=0;$i<mysql_num_fields($result);$i++) "<td="" echo="" {="">".$row[$i]."";
}
echo "";
}
echo "</mysql_num_fields($result);$i++)></table>

1";   
2}   
3  

输出结果:
level id a
1 4 9
2 2 6
2 7 6
3 5 5
3 8 5
4 3 4
5 1 2
6 6 0
6 9 0

Published At
Categories with Web编程
comments powered by Disqus