有这样一道题,要求使用纯mysql实现一个TF-IDF算法。
原始的输入是一个有articles表,有100列,每列存储一个单词。其实核心难点就是怎么遍历对比这100个词和指定词比如'apple'进行对比。首先蛮力穷举所有的列名,如word1 、word2。。。但是这样做代码肯定丑的不像样,而且如果是1000列怎么办呢。
要遍历列的话第一步是要把列名取出来。
create temporary table column_name #建立临时表
select ORDINAL_POSITION, COLUMN_NAME #选择主位置(类似主键),列名
from information_schema.columns
where table_name='articles1' and COLUMN_NAME like 'word%';# 从 articles1表中取列,仅取出以word开头的
第二步就是要实现循环,使用循环来取出所有列名依次对比,这里主要使用到了procedure、concat、preparestatement。prcedure类似其他语言里的函数,concat涌来拼接字符串,而preparestatement用来将字符串按sql程序执行。
tip1:procedure有个坑,开始时一直调试不成功,这是因为delimiter的问题,也就是怎么样算是你的语句结束了。默认delimiter是';',但是定义procedure时因为中间不能被中断而又会有多条语句,所以先使用 delimter // 命令改变默认delimiter
create procedure pro1(
in article_id integer,
in