2015-10-06 62 views
0

我有两个表格:sql /存储过程来查找word标记表中的匹配记录

CREATE TABLE doc 
    ( doc_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT 
    , doc_text VARCHAR(10000) NOT NULL 
); 

CREATE TABLE doc_tag 
    ( doc_id INT NOT NULL 
    , tag_word VARCHAR(50) NOT NULL 
    , PRIMARY KEY(doc_id, tag_word) 
    , KEY ix_doc_tag_word_doc_id (tag_word, doc_id) 
); 

表格doc中的记录可能有例如,在doc_tag表中有5,10甚至20个相关的字标签。

我该如何编写MYSQL中的存储过程,我可以为该BASE doc记录和最少匹配标记字数(表doc_tag)提供doc_id。结果应该是doc_id其他doc记录与BASE doc记录具有相同的最小字数(存储在doc_tag中)。

所以我的原始基础doc记录可能在doc_tag表10分的标签的话,但我想找到的所有其他doc记录在doc_tag共享10个标记的话至少5。只要至少有5个属于BASE doc记录的单词中的至少5个在属于其他doc记录的doc_tag记录中找到也没关系。

一个例子: BASE: doc.doc_id:1
doc_text: “这是我的基本文件”

doc_tag.doc_id:1,doc_tag.tag_word:书
doc_tag.doc_id:1,doc_tag.tag_word:表
doc_tag.doc_id:1 ,doc_tag.tag_word:chair
doc_tag.doc_id:1,doc_tag.tag_word:wall
doc_tag.doc_id:1,doc_tag.tag_word:地板
doc_tag.doc_id:1,doc_tag.tag_word:房子
doc_tag.doc_id:1,doc_tag.tag_word:手机
doc_tag.doc_id:1,doc_tag.tag_word:天花板

匹配其他doc记录:
doc.doc_id:20187
doc_text:“这是一个标签匹配OTHER文档”

doc_tag.doc_id:20187,doc_tag.tag_word:天花板
doc_tag.doc_id:20187,doc_tag.tag_word:地板
doc_tag.doc_id:20187,doc_tag.tag_word:房间
doc_tag.doc_id:20187,doc_tag.tag_word:房子
doc_tag.doc_id:20187,doc_tag.tag_word:墙壁
doc_tag.doc_id:20187 ,doc_tag.tag_word:电话
doc_tag.doc_id:20187,doc_tag.tag_word:地下室
doc_tag.doc_id:20187,doc_tag.tag_word:楼道

之所以记录是匹配的是单词“天花板”,“楼”,“房子”,“手机”和“墙”是两个doc记录标签的话。没有关系,两者都有不共享的其他标签字。

可能需要准备代码来确定最初的10个标记词的5个可能组合,以创建最终查询。但是,我有这样的感觉,就是有一种美丽而紧凑的方式来做到这一点,而这一切只是让我无法回避。

如果mySQL的存储过程语言没有配备处理这个问题,那么可以在另一种方言中提出解决方案,例如, MSSQL的T-SQL。它主要是一个会用我感兴趣的算法

回答

1

尝试是这样的:

SELECT OTHER.doc_id 
FROM doc_tag BASE 
INNER JOIN doc_tag OTHER ON BASE.doc_id <> OTHER.doc_id AND 
          BASE.tag_word = OTHER.tag_word 
WHERE BASE.doc_id = @baseid 
GROUP BY OTHER.doc_id 
HAVING COUNT(*) >= @min_records 

基本上,您正在为基础文档获取所有标记,筛选这些标记的所有其他实例,然后按文档ID对这些标记进行分组以获得计数。

+0

非常感谢您的帮助! 本来会提高答案的评分,但作为一个新用户,我显然必须在获得允许之前赢得更多声誉。 – Orion

0

我想你想一个group byhaving条款:

select doc_id 
from doc d join 
    doc_tag t 
    on d.doc_id = t.doc_id 
group by doc_id 
having count(*) >= 5; 
+0

这只会查找与其关联的任何5个标签词最少的文档。但是,我试图找到与原始基本文档记录匹配的文档记录,并且匹配条件是BASE和OTHER文档必须共享至少5个标签词(存储在doc_dag表中的那些词)。我会尽量让我原来的问题更清楚些。 – Orion

相关问题