2015-10-06 64 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

相關問題