说我有一个像ID,NAME,SCORE这样的表。现在通常,为了获得团队的排名,我会选择所有并按顺序排序。有时候,我不想知道所有的排名,只想知道一个团队的排名。如果我添加了RANK列,那么MySQL有什么办法可以根据SCORE自动为我填写这些值? (我相信MS Excel具备此功能)
如果是的话,它如何处理关系?
感谢
答案 0 :(得分:2)
您可以在进行查询时计算排名:
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
如果这对你来说不够快,那么请改用触发器。
答案 1 :(得分:0)
看起来我正在寻找一个MySQL触发器
答案 2 :(得分:0)
获取所有小组:
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)
上面示例中显示的方法动态获取排名(不填充常规表或临时表)。
注意:这两个假设一个给定的团队只在得分表中存在一次,以使得秩值正确。