mysql 实现排名的sql语句问题

soaringbird 2015-01-05 10:04:10
1.创建表
Create Table: CREATE TABLE `sam` (
`a` int(11) DEFAULT NULL,
`b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8

2.插入模拟数据
INSERT INTO `sam` VALUES (1,10),(1,15),(1,20),(1,25),(2,20),(2,22),(2,33),(2,45);
+------+------+
| a | b |
+------+------+
| 1 | 10 |
| 1 | 15 |
| 1 | 20 |
| 1 | 25 |
| 2 | 20 |
| 2 | 22 |
| 2 | 33 |
| 2 | 45 |
+------+------+

3.SQL实现
select a,b,rownum,rank from
(select ff.a,ff.b,@rownum:=@rownum+1 rownum,if(@pa=ff.a,@rank:=@rank+1,@rank:=1) as rank,@pa:=ff.a
FROM
(select a,b from sam group by a,b order by a asc,b desc) ff,(select @rank:=0,@rownum:=0,@pa=null) tt) result
having rank <=2;

4.结果:
+------+------+--------+------+
| a | b | rownum | rank |
+------+------+--------+------+
| 1 | 25 | 1 | 1 |
| 1 | 20 | 2 | 2 |
| 2 | 45 | 5 | 1 |
| 2 | 33 | 6 | 2 |
+------+------+--------+------+
4 rows in set (0.00 sec)

问题是:
为什么第一次运行这条语句,结果集不对,仍然是原始的8条数据,第二次执行,结果才正确。
这是mysql的问题,还是语句的问题?
...全文
247 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2015-01-05
  • 打赏
  • 举报
回复
变量没有初始化。
引用
2. 使用MySQL变量;在某些情况下,无法通过修改程序来实现时,可以考虑这种方法。 缺点,@x 变量是 connection 级的,再次查询的时候需要初始化。一般来说PHP等B/S应用没有这个问题。但C/S如果connection一只保持则要考虑 set @x=0 mysql> select @x:=ifnull(@x,0)+1 as rownum,id,col -> from tbl -> order by col; +--------+----+------+ | rownum | id | col | +--------+----+------+ | 1 | 1 | 26 | | 1 | 3 | 35 | | 1 | 2 | 46 |
soaringbird 2015-01-05
  • 打赏
  • 举报
回复
谢谢二位,的确是变量初始化的问题,写错了,原版的有错误,照着写也错了。@pa=NUL少了冒号
wwwwb 2015-01-05
  • 打赏
  • 举报
回复
SELECT * FROM ( SELECT ff.a,ff.b,@rownum:=@rownum+1 rownum, IF(@pa=ff.a,@rank:=@rank+1,@rank:=1) AS rank,@pa:=ff.a FROM (SELECT a,b FROM sam GROUP BY a,b ORDER BY a ASC,b DESC) ff,(SELECT @rank:=0,@rownum:=0,@pa=NULL) tt) A WHERE RANK<=2
  • 打赏
  • 举报
回复
语法上没有看不出错误啊。

56,875

社区成员

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

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