根据另一列值的顺序对表中的所有行进行编号

时间:2012-07-10 16:20:17

标签: php mysql

我目前有一张497k字的表。每个单词及其在英语中的相对频率都是一行。我想创建另一个列,它将根据频率从1到497k(此列表中的字数)对它们进行排序,最高频率为1,依此类推。我怎样才能做到这一点?我正在使用MySQL 5.1.54

1 个答案:

答案 0 :(得分:1)

我想出了这个(复杂的,但可能是快速的)一个声明的解决方案:

update vocabulary SET rank = 

(
SELECT ranking.rank FROM (
  SELECT @rownum:=@rownum + 1 as rank, voca.word
  FROM 
      (
        SELECT v.word, v.frequency
        FROM vocabulary v
        ORDER BY v.frequency DESC
      ) voca,
     (SELECT @rownum := 0) r
) ranking
WHERE ranking.word = vocabulary.word
);

我相信这可以进一步得到优化,但对于这个问题来说,这可能是一个很好的起点。

此外,对于具有不同单词但频率相同的行进行排名可能仍存在问题。

这是一个SQL小提琴: http://sqlfiddle.com/#!2/a00e2/1