2017-04-21 82 views
0

我有一張表來存儲書名。每當我插入一個新的標題,我想檢查,如果標題已經存在。問題在於,由於拼寫錯誤,無法進行完全匹配。MySQL匹配集詞

例如

'My Dream of Wonder Land' 
'My Deam of Wonder Land' 

所以我的目標是爲每個標題創建標籤,至多3個標籤爲每本書。這些標籤標題的3個最長的一句話:

'My Dream of Wonder Land' = dream, wonder, land 
'My Deam of Wonder Land'= deam, wonder, land 

現在,當我添加標題,我想找到的所有冠軍,至少有兩個匹配的標籤。標籤的順序應該被忽略,這意味着

'land, dream, lego' 

也應該匹配。

在MySQL中存儲數據的最佳方式是什麼?

+0

您可以嘗試模糊搜索以查看書名是否存在。 http://stackoverflow.com/questions/369755/how-do-i-do-a-fuzzy-match-of-company-names-in-mysql-with-php-for-auto-complete – fqhv

+1

問題是,您可以擁有相同標題的書籍。匹配應該在ISBN號碼或類似的東西上完成,而不是標題。 – Shadow

+0

@fqhv謝謝,soundex聽起來很有希望。但是,如果單詞的順序改變,它不起作用。 –

回答

0

我建議使用fuzzy matching,因爲這些比較可能非常複雜。

也就是說,使用標籤的想法聽起來更有趣。

我可能會爲表格標記並垂直存儲它們。

CREATE TABLE BookTag (
    BookId INT, 
    Tag NVARCHAR(50)) 

然後,當插入書籍時,您將首先計算標籤並將它們存儲在臨時表中。我會寫一個函數從字符串中獲取最大的單詞。對於這個例子,我只是假設這個函數存在,叫做nthLargestWord(VARCHAR expression, INT n)

INSERT INTO TEMPORARY NewBookTag (Tag) 
SELECT nthLargestWord(@booktitle, 1) 
UNION 
SELECT nthLargestWord(@booktitle, 2) 
UNION 
SELECT nthLargestWord(@booktitle, 3) 

您現在可以將此表連接到您現有標記的表格以查看是否有任何共有2個表格。

SELECT e.BookId 
FROM NewBookTag n 
INNER JOIN BookTag e ON n.Tag = e.Tag 
GROUP BY e.BookId 
HAVING COUNT(*) >= 2 

你可以只是把這個在IF EXISTS插入時,它是假的。

插入你的書後,你已經準備好插入標籤了!

INSERT INTO Book (BookTitle) 
VALUES (@BookTitle) 

INSERT INTO BookTag (BookId, Tag) 
SELECT b.BookId, t.Tag 
FROM Book b 
INNER JOIN NewBookTag t ON b.Title = @booktitle 

此解決方案允許您一次插入一本書,它可以被重構爲允許多個如果需要的話。