请教个SQL排行排名问题

cskiller2049 2009-09-21 12:23:32
MYSQL 表结构 user_id rank_test(排行的依据) 俩字段

SET @rank=0;

SELECT @rank := @rank +1 AS rank, `rank_test`,
FROM `battlezone_rank`
ORDER BY `rank_test` DESC

想请教的是
1. 这个语句效率高不 百万级 千万级 实时查询会不会有问题
2. 我要查找某个 user_id 的排名应该怎么写?
3. 有没有其他的排名方法? (数据库结构)
...全文
284 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
百年树人 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 cskiller2049 的回复:]
引用 6 楼 josy 的回复:
SQL codeSELECT
  (selectcount(1)+1from `battlezone_rank`where `rank_test`>t.`rank_test`)as rank,
  `rank_test`,FROM
  `battlezone_rank`  twhere
  userid_id='xxx'

谢谢 josy 看到很多`rank_test`>t.`rank_test`这样来排序的了  这样效率比@rank+1高?
[/Quote]

子查询的效率不是很高,可能后者会更好一点,楼主可以测试对比一下
cskiller2049 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 josy 的回复:]
SQL codeSELECT
(selectcount(1)+1from `battlezone_rank`where `rank_test`>t.`rank_test`)as rank,
`rank_test`,FROM
`battlezone_rank` twhere
userid_id='xxx'
[/Quote]
谢谢 josy 看到很多`rank_test`>t.`rank_test`这样来排序的了 这样效率比@rank+1高?
百年树人 2009-09-21
  • 打赏
  • 举报
回复
上面的两个语句部分直接拷贝了楼主的,更正一处错误:把`rank_test`, 后面的','去掉
百年树人 2009-09-21
  • 打赏
  • 举报
回复
SELECT 
(select count(1)+1 from `battlezone_rank` where `rank_test`>t.`rank_test`) as rank,
`rank_test`,
FROM
`battlezone_rank` t
where
userid_id='xxx'
百年树人 2009-09-21
  • 打赏
  • 举报
回复
SET @rank=0; 

select rank
from
(
SELECT @rank := @rank +1 AS rank, `rank_test`,
FROM `battlezone_rank`
ORDER BY `rank_test` DESC
) t
where user_id='xxx'
cskiller2049 2009-09-21
  • 打赏
  • 举报
回复
继续等待中...
cskiller2049 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhoupuyue 的回复:]
SQL codeselect rt.user_id,(selectcount(*)from battlezone_rankwhereuser_id>rt.user_id)+1as rankfrom rank_test rtorderbyuser_iddesc;

[/Quote]
兄弟 你这貌似是根据user_id排名的吧
cskiller2049 2009-09-21
  • 打赏
  • 举报
回复
等待回复中...
阿_布 2009-09-21
  • 打赏
  • 举报
回复

select rt.user_id,(select count(*) from battlezone_rank where user_id>rt.user_id)+1 as rank
from rank_test rt
order by user_id desc;

ACMAIN_CHM 2009-09-21
  • 打赏
  • 举报
回复
[Quote]排序结果为:
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[/Quote]

这个问题比较常见。关键是用户如何定义这个“排名”的问题。 比如对 80 的前面有两个并列第一的,这个80的是第二,还是第三,要看业务逻辑而定了。 如果80为第二,则可以用 COUNT(DISTINCT) , 但这种排名方式相对比较少见。
luoyoumou 2009-09-21
  • 打赏
  • 举报
回复
--count(*)只能用在普通排序里面,用在分组排序里面,就不对了!
--比如:按成绩分组排序:
有8个人的成绩:
a 80
b 90
c 70
d 70
e 80
f 80
d 90
g 90

排序结果为:
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

--楼主:高人,你用count(*)排个给我看看?
ACMAIN_CHM 2009-09-21
  • 打赏
  • 举报
回复
[Quote]命题是 取得某个人的排名 5L 6L的写法做比较 [/Quote]

如果这样,反而是10楼的最快(在有索引(`rank_test` ) 和 (userid_id) 情况下)。
select count(*)+1 from `battlezone_rank`  where `rank_test` >(select `rank_test` from `battlezone_rank`  where userid_id='xxx'
cskiller2049 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 acmain_chm 的回复:]
引用还要再请教下  变量+1  和 count(*)+1  效率哪个会更高些?为什么?

比较时的命题是什么? 两种各有不同的应用场景。
[/Quote]
命题是 取得某个人的排名 5L 6L的写法做比较
谢谢 ACMAIN_CHM
ACMAIN_CHM 2009-09-21
  • 打赏
  • 举报
回复
[Quote]还要再请教下 变量+1 和 count(*)+1 效率哪个会更高些?为什么?[/Quote]

比较时的命题是什么? 两种各有不同的应用场景。
cskiller2049 2009-09-21
  • 打赏
  • 举报
回复
还要再请教下 变量+1 和 count(*)+1 效率哪个会更高些?为什么?
不胜感激
nianzhang747 2009-09-21
  • 打赏
  • 举报
回复
恩 支持树人的变量法

效率确实不错
ACMAIN_CHM 2009-09-21
  • 打赏
  • 举报
回复
1. 这个语句效率高不 百万级 千万级 实时查询会不会有问题
@rank+1 的效率已经很高了.

2. 我要查找某个 user_id 的排名应该怎么写?
select count(*)+1 from `battlezone_rank`  where `rank_test` >(select `rank_test` from `battlezone_rank`  where userid_id='xxx'

56,687

社区成员

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

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