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


Number all rows in table based on order of another column value

我现在有一个表,它有497k个单词。英语中的每个单词及其相对频率都是一行。我想做另一个专栏,根据它们的频率从1到497k(这个列表中的单词数量)排序,最高频率为1,依此类推。我该怎么做?我使用的是MySQL 5.1.54

我提出了一个(复杂但可能很快)的单语句解决方案:

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 Fiddle:http://sqlfiddle.com/#!2/a00e2/1