2017-08-27 57 views
0

我使用這個查詢,統計所有行表「書」,這裏的「名稱」欄值重複它自己:如何計算MYSQL中重複值的行,並考慮REGEXP或通配符?

SELECT name, COUNT(*) c FROM books GROUP BY name HAVING c > 1 

的事情是,我想治療非常類似的書名稱,作爲「重複」。例如,名爲「好書」和「好書」的書籍。將被視爲相同。我知道,或多或少,如何使用REGEXP和通配符,但我不知道如何將它合併到我正在使用的查詢中(如果它甚至可能)。

有什麼辦法可以達到這個目的嗎?

+0

也許你應該考慮全文索引,而不是正則表達式。 –

+0

對不起......但這是什麼意思,「全文索引」? – sheff2k1

+0

https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html –

回答

1

有一個叫SOUNDEX MYSQL字符串函數。這是一個很長的範圍,但可能只是做你需要的。 SOUNDEX應該爲聽起來相同的兩個文本字符串返回相同的「代碼串」。見this link for more about SOUNDEX

所以,你可以嘗試一下本作的大小

SELECT SOUNDEX(name) as sname, COUNT(*) c FROM books GROUP BY sname HAVING c > 1

使用正則表達式從詢問您是否要您將需要對您想要達到的效果更具體的,因爲它不是明確只是刪除標點符號或者有更多的東西讓你看看事情是否相似。

前瞻性的方式是添加另一個列,讓我們說UNIFORM_NAME並有一個單獨的工具/程序來填充柱,例如向表中添加項目時。如果您計劃多次運行此類查詢,這將非常有用。然後,您可以針對這個新列使用您的SQL代碼,並且如果您發明了一種新的(更好的)方法來協調名稱進行比較,則可以根據名稱和新算法更新該新列,其餘解決方案將工作而不需要進一步的改變。

+0

嗯,非常感謝你的提示。我只會用服務器端邏輯來解決這個問題。我只是想,也許SQL方法會更「優雅」。 – sheff2k1