2013-02-12 4 views
11

非常によく似ていますが正確ではないエントリが重複しています。ここではいくつかの例は以下のとおりです。単一の列で類似の値を見つけるための良いmysqlクエリ

- 2016: Obama's America 
- 2016: Obama's America (VF) 

- Hurt Locker 
- The Hurt Locker 

私はtitles潜在的に似て取得するために使用できるクエリでしょうか?

更新:私はEXACT重複を削除しようとしていませんのでご注意ください。私は単一の列で同様の値を選択しようとしています。

+3

良い質問!おそらく[soundex](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex)の何か? –

+0

「類似」を定義してください。 – Tchoupi

+0

@ArnoldDaniels良いアイデア、参考に感謝します。 – David542

答えて

3

これが最良の方法または最も効率的であるかどうかはわかりませんが、それは間違いなく類似の意味によります。意味はタイトルが1行のテキストのすべてが、別の行のテキストの一部が含まれている場合、このようなものが動作するはずです:

SELECT DISTINCT T.Title 
FROM YourTable T 
    LEFT JOIN YourTable T2 ON T.Title != T2.Title 
WHERE T.Title LIKE CONCAT('%', T2.Title, '%') 
UNION 
SELECT DISTINCT T2.Title 
FROM YourTable T 
    LEFT JOIN YourTable T2 ON T.Title != T2.Title 
WHERE T.Title LIKE CONCAT('%', T2.Title, '%') 
ORDER BY Title 

そして、ここではSQL Fiddleです。

+0

私はこれがしないと思います。映画[アメリカ](http://www.imdb.com/title/tt1670931/)は、すべての映画とアメリカの映画にマッチします。 –

+0

@ArnoldDaniels - ええ、私が言ったように、同様に非常に曖昧です:)興味深い質問にもかかわらず。私はあなたに尋ねたいと思っています - アメリカとは何がマッチしますか? America Oneのような映画だけではなく、America The Great :)運が最高です。 – sgeddes

+0

@ArnoldDaniels - 1つの選択肢は、最大の長さの差を追加することです - ここでは簡単なフィドルです:http://sqlfiddle.com/#!2/17173/1 – sgeddes

3

これは、文字列間の距離を測定することで解決できると思います。string metricです。

Levenshteinが最もよく知られているメトリックであると思われ、私はこれをOracleで実装しています。それはまたimplemented for MySQLです。他にも役立つ指標が見つかるかもしれません。

関連する問題