1

私のシステムには、さまざまな e ショップの製品が保存されており、名前に従って製品をペアリングする必要があります。例えば:

入力: MySQL テーブル製品

id | name                       | id_seller
1    porsche 911 red edition      1
2    red porsche 911 gt           2
3    icecream                     1

望ましい出力:製品 1 が製品 2 に類似しているという提案。

最初のステップでは、一般的な単語の数 (このポルシェの例では 4 分の 3) について提案するだけで十分です。

より洗練された解決策には、単語の出現だけでなく単語の順序を比較することも含まれますが、それは簡単ではないと思います。

MySQLクエリとその組み込み関数だけを使用して実行できますか、または洗練されたライブラリ/アドオンを使用する必要がありますか?

4

1 に答える 1

2

列に少なくとも 1 つの共通語がある製品のペアを検索するSQLFiddle の例を次に示します。name

select t.id id1, t.name name1, t1.id id2, t1.name  name2 from t
join t t1
where t.id<t1.id
      AND
      t.name regexp 
        CONCAT('([[:<:]]',
               REPLACE(
                   TRIM(t1.name),
                   ' ',
                   '[[:>:]]|[[:<:]]'
               ),
               '[[:>:]])');

少なくとも N 個の一般的な単語を含む行を見つける必要がある場合は、各行を単語に分割する tmp テーブルを作成する必要があります。これを行うための例とストアド プロシージャを次に示します。あなたの例では、このテーブルは次のようになります。

id | name                       
1    porsche
1    911
1    red
1    edition      
2    red
2    porsche
2    911
2    gt           
3    icecream                     

この場合、次のクエリを使用して、少なくとも N 個の一般的な単語 (この場合は N=3) を持つ ID を見つけることができます。

select t1.id,t2.id,count(*)
from tmp t1,tmp t2
where t1.id<t2.id and t1.name=t2.name
group by t1.id,t2.id having count(*)>=3
于 2012-09-21T12:21:54.387 に答える