【问题标题】:Automate MySQL fields (like Excel)自动化 MySQL 字段(如 Excel)
【发布时间】:2010-01-15 08:00:26
【问题描述】:

假设我有一个像 ID、NAME、SCORE 这样的表。现在通常,要获得团队的排名,我会选择所有并排序。不过有时候,我不想知道所有的排名,只想知道一支球队的排名。如果我添加了列 RANK,MySQL 有没有办法根据 SCORE 自动为我填写这些值? (我相信 MS Excel 有这个能力)

如果是这样,它如何处理平局?

谢谢

【问题讨论】:

    标签: mysql automation


    【解决方案1】:

    您可以在查询时计算排名:

    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
    

    如果这对您来说不够快,请改用触发器。

    【讨论】:

    • 这看起来很酷,但我一点都不懂。你能解释一下吗?另外,不幸的是,我尝试运行它,但它只给了我排名第一的团队?
    • 我已经为答案添加了一些解释。如果您想要其他团队,请尝试将“WHERE id = 1”更改为其他内容。
    【解决方案2】:

    看起来我正在寻找 MySQL 触发器

    【讨论】:

      【解决方案3】:

      获取所有个团队:

      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)
      

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

      注意:这两个都假设一个给定的团队在分数表中只存在一次,以便排名值是正确的。

      【讨论】:

        猜你喜欢
        • 2013-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多