我试图从我的数据集中获取每周排名类型的结果,并且使用多种技术失败。
我的数据如下:
+------------+------+--------+
| team | week |points |
+------------+------+--------+
| blue | 1 | 10 |
| green | 1 | 15 |
| red | 1 | 16 |
| blue | 2 | 5 |
| green | 2 | 18 |
| red | 2 | 6 |
| blue | 3 | 2 |
| green | 3 | 8 |
| red | 3 | 8 |
+------------+------+--------+
我正试图得到这样的东西:
+------------+------+--------+
| team | week | rank |
+------------+------+--------+
| blue | 1 | 3 |
| green | 1 | 2 |
| red | 1 | 1 |
| blue | 2 | 3 |
| green | 2 | 1 |
| red | 2 | 2 |
| blue | 3 | 3 |
| green | 3 | 1 |
| red | 3 | 1 |
+------------+------+--------+
你可以在第3周看到分数是并列的,所以排名也需要联系起来。并列排名始终是值中的较低者。 (即联合第2名将总是排名2 2而不是3 3)。
它可以是存储过程,视图,任何东西。但它需要是MySql。
到目前为止,我有这个:
SELECT team,
@rnk:= CASE
WHEN @week_id <> week THEN 0
WHEN points = @tot THEN @rnk
ELSE @rnk+1
END
AS rank,
@week_id := week AS wk,
@tot := points AS pts
FROM
(SELECT @rnk:= -1) s,
(SELECT @week_id:= -1) c,
(SELECT *
FROM v_weeklypointtotals
ORDER BY week, points DESC
) t
但是,从MySql工作台调用它时效果很好。但是当通过PHP调用它时会得到不正确的结果。 (它没有考虑到并列的周数)。我认为这可能与变量设置的顺序有关......但我很难过。
答案 0 :(得分:3)
试试这个:
select team,week,
(select count(*)+1 from Table1 where week=t1.week
and points >t1.points ) as rank
FROM Table1 t1
答案 1 :(得分:-1)
顺便说一句,如果你没有费心去查看我在评论中链接的SO帖子你可以试试这个魔法:)
SELECT (
CASE Week
WHEN @curW
THEN @curRow := @curRow + 1
ELSE @curRow := 1 AND @curW := Week END
) + 1 AS rank,
Week,
team,
points
FROM tablename,
(SELECT @curRow := 0, @curW := 0) r
ORDER BY Week DESC, points DESC;