如何从varchar列中获取单词及其在mysql中的出现频率

如何从varchar列中获取单词及其在mysql中的出现频率,mysql,sql,select,innodb,Mysql,Sql,Select,Innodb,我有一个varchar(255)列,带有FULLTEXT索引。我需要一个查询,以获取整个列中最频繁的单词 Word Frequency key1 4533 key2 4332 key3 2932 注1:我更愿意跳过诸如介词之类的常用词,但这并不重要,因为我以后可以过滤它们。刚才提到它是否可以加快查询速度 注2:这是一个超过一百万行的表。这不是一个常规的查询,但实际上应该是快速的 如果您甚至给出一个查询的外观提示,这将是一个很大的帮助。这在MySQL中并不容易做到。全文索

我有一个
varchar(255)
列,带有
FULLTEXT
索引。我需要一个查询,以获取整个列中最频繁的单词

Word    Frequency
key1    4533
key2    4332
key3    2932
注1:我更愿意跳过诸如介词之类的常用词,但这并不重要,因为我以后可以过滤它们。刚才提到它是否可以加快查询速度

注2:这是一个超过一百万行的表。这不是一个常规的查询,但实际上应该是快速的


如果您甚至给出一个查询的外观提示,这将是一个很大的帮助。

这在MySQL中并不容易做到。全文索引不可用于查询。你能做的一件事就是提取单词。这有点痛。以下假设单词由单个空格分隔,并获取前三个单词的频率:

  select substring_index(substring_index(t.words, ' ', n.n), ' ', -1) as word, count(*)
  from t cross join
       (select 1 as n union all select 2 union all select 3
       ) n
       on n.n <= length(t.words) - length(replace(t.words, ' ', '') + 1
  group by substring_index(substring_index(t.words, ' ', n.n), ' ', -1) 
  order by count(*) desc;
选择子字符串索引(子字符串索引(t.words,,,n.n),“”,-1)作为单词,计数(*)
从t交叉连接
(选择1作为n联合所有选择2联合所有选择3
)n

在n.n上,在应用程序代码中执行,而不是在SQL中执行。