0

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

4

1 回答 1

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

于 2012-07-10T17:01:38.927 回答