排行榜的问题,如果设置榜单排名?

madmanahong 2011-05-11 09:56:58
排行榜的问题,如果设置榜单排名?

现在有一个问题,我有一组数据可以得到一个排行名次。
譬如,有一个原始表table1

account | value1 | value2
--------------------------
aaa 10 20
bbb 30 40
ccc 15 30


我对其insert .. select .. order by value1 desc;
插入到另一个表table2

结果就是。table2就是一个排行榜结果表。

account | value1
-----------------
bbb 30
ccc 15
aaa 10




*******************************************
*****************问题来了******************
*******************************************


1. 我如何知道ccc在这个排行中的名次?






2. 如果换种方法:
我直接将名次插入到数据库中,增加一列,怎么办?
即:

account | value1 | Order
------------------------
bbb 30 1
ccc 15 2
aaa 10 3







非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!
非常感谢!!!!!!


















...全文
127 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
madmanahong 2011-05-11
  • 打赏
  • 举报
回复


DELIMITER $$

DROP PROCEDURE IF EXISTS `database`.`top_create_level` $$
CREATE PROCEDURE `database`.`top_create_level` ()
BEGIN

DECLARE nRankOrder INT;
SET @nRankOrder := 1;

# clear current table
TRUNCATE TABLE database.top_level;

INSERT database.top_level
SELECT t0.ID, t0.Level, t0.Name, @nRankOrder := @nRankOrder + 1
FROM database.account AS t0
ORDER BY t0.Level Desc Limit 5000;

END $$

DELIMITER ;







这样就好了。。。。
具体原因不明


:=




=

有啥区别么?

。。。。
wwwwb 2011-05-11
  • 打赏
  • 举报
回复
DELIMITER $$

DROP PROCEDURE IF EXISTS `database`.`top_create_level` $$
CREATE PROCEDURE `database`.`top_create_level` ()
BEGIN

SET @nRankOrder = 1;
TRUNCATE TABLE `database`.top_level;
SELECT t0.ID, t0.`LEVEL`,t0.`NAME`,@nRankOrder:=@nRankOrder+1 FROM `database`.account AS t0
ORDER BY t0.LEVEL DESC LIMIT 5000;
-- INSERT INTO `database`.top_level
END $$

DELIMITER ;
madmanahong 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwwb 的回复:]
假设value1唯一
[/Quote]

value1肯定不唯一啊。值可能一样。
madmanahong 2011-05-11
  • 打赏
  • 举报
回复
如果不在存储过程中,是没问题的。。。
madmanahong 2011-05-11
  • 打赏
  • 举报
回复
nRankOrder:= nRankOrder + 1

放到存储过程里面 := 会报1064错误。
wwwwb 2011-05-11
  • 打赏
  • 举报
回复
SELECT t0.ID, t0.Level, t0.Name, nRankOrder:= nRankOrder + 1
madmanahong 2011-05-11
  • 打赏
  • 举报
回复



DELIMITER $$

DROP PROCEDURE IF EXISTS `database`.`top_create_level` $$
CREATE PROCEDURE `database`.`top_create_level` ()
BEGIN

DECLARE nRankOrder INT;
SET nRankOrder = 1;

# clear current table
TRUNCATE TABLE database.top_level;

INSERT database.top_level
SELECT t0.ID, t0.Level, t0.Name, nRankOrder = nRankOrder + 1
FROM database.account AS t0
ORDER BY t0.Level Desc Limit 5000;

END $$

DELIMITER ;


wwwwb 2011-05-11
  • 打赏
  • 举报
回复
set @nRankOrder=0;
INSERT top_level
SELECT t0.ID, t0.Level, t0.Name, nRankOrder:= nRankOrder + 1 FROM account AS t0
ORDER BY Level Desc Limit 5000;
madmanahong 2011-05-11
  • 打赏
  • 举报
回复
INSERT top_level
SELECT t0.ID, t0.Level, t0.Name, nRankOrder = nRankOrder + 1 FROM account AS t0
ORDER BY Level Desc Limit 5000;

简化完就是这样。

结果nRankOrder对应的列里面都是0
wwwwb 2011-05-11
  • 打赏
  • 举报
回复
你的代码
madmanahong 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wwwwb 的回复:]
假设value1唯一
set @num=1;
insert .. select *,@num:=@num+1 from tt order by value1 desc;
[/Quote]


这个我放到存储过程中,结果插入的都是0,不知道为啥。。。
madmanahong 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 wwwwb 的回复:]


1楼已经有这样的代码
[/Quote]


呵呵,你是在insert的时候就插入了。他的意思好像是select出来的时候再设置一个值。


madmanahong 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 rucypli 的回复:]
create procedure sp_test()
begin
set @a:=1
select @a := @a + 1,* from ccc
end

call sp_test();
[/Quote]

这样貌似会有问题,我发现select ... insert的时候有的时候不是顺序的。。。
wwwwb 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 madmanahong 的回复:]
引用 9 楼 rucypli 的回复:
create procedure sp_test()
begin
set @a:=1
select @a := @a + 1,* from ccc
end

call sp_test();


想了想,这种效率应该最高
[/Quote]
1楼已经有这样的代码
madmanahong 2011-05-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 rucypli 的回复:]
create procedure sp_test()
begin
set @a:=1
select @a := @a + 1,* from ccc
end

call sp_test();
[/Quote]

想了想,这种效率应该最高
rucypli 2011-05-11
  • 打赏
  • 举报
回复
create procedure sp_test()
begin
set @a:=1
select @a := @a + 1,* from ccc
end

call sp_test();
jiahehao 2011-05-11
  • 打赏
  • 举报
回复
嗯。这样就是太慢了,每次都要计算。

看你更新是不是很频繁。如果不频繁,也可以让某列专门记录该行数据的名次。

再该设个触发器,每次有新数据插入,则更新所有名次。

最后在该名次列建索引。
wwwwb 2011-05-11
  • 打赏
  • 举报
回复
自己测试一下 嘛
select * from tt a left join tt b on a.value1<=b.value1
看看结果
madmanahong 2011-05-11
  • 打赏
  • 举报
回复
好歹说两句说明吧。各位老大们。。。

我都哭了。
wwwwb 2011-05-11
  • 打赏
  • 举报
回复
假设value1唯一
set @num=0;
insert .. select *,@num:=@num+1 from tt order by value1 desc;

or

select a.account,a.value1,count(b.*) from tt a left join tt b on a.value1<=b.value1 group by a.account,a.value1

加载更多回复(4)

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧