【发布时间】:2010-01-15 08:00:26
【问题描述】:
假设我有一个像 ID、NAME、SCORE 这样的表。现在通常,要获得团队的排名,我会选择所有并排序。不过有时候,我不想知道所有的排名,只想知道一支球队的排名。如果我添加了列 RANK,MySQL 有没有办法根据 SCORE 自动为我填写这些值? (我相信 MS Excel 有这个能力)
如果是这样,它如何处理平局?
谢谢
【问题讨论】:
标签: mysql automation
假设我有一个像 ID、NAME、SCORE 这样的表。现在通常,要获得团队的排名,我会选择所有并排序。不过有时候,我不想知道所有的排名,只想知道一支球队的排名。如果我添加了列 RANK,MySQL 有没有办法根据 SCORE 自动为我填写这些值? (我相信 MS Excel 有这个能力)
如果是这样,它如何处理平局?
谢谢
【问题讨论】:
标签: mysql automation
您可以在查询时计算排名:
SELECT * FROM (
SELECT teams.*, @rownum := @rownum + 1 AS rank
FROM teams, (SELECT @rownum := 0) T1
ORDER BY score DESC) T2
WHERE id = 1
它的工作原理是将名为 rownum 的变量初始化为 0,然后按分数递减的顺序遍历行。对于每个团队,rownum 都会增加,并根据 rownum 的当前值为团队分配排名。外部选择应用 where 子句,因此只返回一行。
这是一个改进的版本,它为得分相同的球队分配相同的排名:
SELECT id, name, teams.score, rank FROM (
SELECT score, @rownum := @rownum + 1 AS rank
FROM (SELECT DISTINCT(score) FROM teams) T1, (SELECT @rownum := 0) T2
ORDER BY score DESC) T3
JOIN teams ON T3.score = teams.score
如果这对您来说不够快,请改用触发器。
【讨论】:
看起来我正在寻找 MySQL 触发器
【讨论】:
获取所有个团队:
SELECT
s1.name,
s1.score,
COUNT(s2.name) + 1 AS rank
FROM scores s1
LEFT OUTER JOIN scores AS s2 ON (s1.score < s2.score)
GROUP BY s1.name
ORDER BY COUNT(s2.name)
获得一个团队('The Canucks'):
SELECT
s1.name,
s1.score,
COUNT(s2.name) + 1 AS rank
FROM scores s1
LEFT OUTER JOIN scores AS s2 ON (s1.score < s2.score)
GROUP BY s1.name
HAVING s1.name = 'The Canucks'
ORDER BY COUNT(s2.name)
以上示例中的方法是动态获取排名的(不是填充常规表或临时表)。
注意:这两个都假设一个给定的团队在分数表中只存在一次,以便排名值是正确的。
【讨论】: