代码之家  ›  专栏  ›  技术社区  ›  Darmen Amanbay Cherma Ramalho

如何对表中的行进行排序并获取行位置?

  •  1
  • Darmen Amanbay Cherma Ramalho  · 技术社区  · 15 年前

    考虑下表结构:

    id    name     rank    position
    -------------------------------
    1     Steve    5        0
    2     David    3        0 
    3     Helen    9        0 
    4     Mark    15        0
    

    我需要一个快速的算法来给这些行打分 rank 列并存储每行的“位置” position 实时字段。

    现在我有了一个残酷的解决方案:

    SELECT * FROM table ORDER BY rank DESC
    

    然后在循环中获取结果,并更新填充位置列的每一行。但是如果我有成千上万的条目呢?如何优化它?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Community paulsm4    7 年前

    几天前我回答了一个与MySQL非常相似的问题:

    Automate MySQL fields (like Excel)

    技巧不是将列存储在数据库中,而是在获取结果时动态计算列。或者,您可以在每次进行插入、更新或删除时使用触发器更新列。

        2
  •  0
  •   Rob Farley    15 年前

    挑选一个:

    WITH t AS
    (
    SELECT 
      ROW_NUMBER() OVER (ORDER BY rank) as RowNum
      ,RANK() OVER (ORDER BY rank) as RankNum
      ,DENSE_RANK() OVER (ORDER BY rank) as DenseRankNum
      , * 
    FROM table
    )
    UPDATE t set position = RankNum
    --UPDATE t set position = RowNum
    --UPDATE t set position = DenseRankNum
    ;