自动化MySQL字段(如Excel)

时间:2010-01-14 22:22:30

标签: mysql automation

说我有一个像ID,NAME,SCORE这样的表。现在通常,为了获得团队的排名,我会选择所有并按顺序排序。有时候,我不想知道所有的排名,只想知道一个团队的排名。如果我添加了RANK列,那么MySQL有什么办法可以根据SCORE自动为我填写这些值? (我相信MS Excel具备此功能)

如果是的话,它如何处理关系?

感谢

3 个答案:

答案 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)

上面示例中显示的方法动态获取排名(填充常规表或临时表)。

注意:这两个假设一个给定的团队只在得分表中存在一次,以使得秩值正确。