2011-12-14 16 views
2

これに似た問題があるようですが、それほど問題はないようです。私はこの道(compare data sets and return best match)に行ってみましたが、自分自身が困惑していました。ベストプラクティスを見つけるためのプロパティのセットを比較

私はセットを取り、最もよく一致するセットを見つける必要があります。つまり、値(1、4、29、44、378、379)を含むsearch_objがあるとします。私は、類似の値を持つ他のオブジェクトを見つけたいと思っています。理想的には、これに最もよく似たオブジェクトを見つけてください。他のオブジェクトが大量にあるため、パフォーマンスが大きな問題になります。

私は現在phpとmysqlで作業していますが、パフォーマンスが改善されたらそれを変更するつもりです。

ありがとうございました。

+0

「似ている」と「最もよく一致する」という意味を具体的に特定したい場合があります。 – goat

答えて

0

それはちょうど私の心に来た:

あなたはユニークなペアのテーブルがあると(a、b)は:

INSERT INTO t1 
VALUES (1,1), (1,2),    -- item to compare with 
     (2,1), (2,3),    -- has one common prop with 1 
     (3,1), (3,2),    -- has the same props as 1 
     (4,1), (4,2), (4,3), (4,4); -- has 2 same props with 1 

CREATE table t1 (a INT, b INT, PRIMARY KEY (a, b)); 

今、あなたがそれを埋めます次のクエリは類似性に従って他のアイテムを注文するでしょう:

SELECT t1.a, 
    COUNT(t2.a) as same_props_count, 
    ABS(COUNT(t2.a) - COUNT(*)) as diff_count 
FROM t1 
LEFT JOIN t1 as t2 ON t1.b = t2.b and t2.a = 1 
WHERE t1.a <> 1 
GROUP BY t1.a 
ORDER BY same_props_count DESC, diff_count; 


a, same_props_count, diff_count 
3, 2,    0 
4, 2,    2 
2, 1,    1 
+0

これは豚だよ...これはいいよ... 本当にありがとう!!!! – fraklo

+0

@ジョン、あなたは大歓迎です! – newtover

0

array_intersectを使用して2つの配列の交差を計算できます。array_intersectは、2番目の配列に存在する最初の配列の値を返します。複数のリストと比較する場合は、戻り配列の長さを使用できます(つまり、長さが長いほど交差点が近くなるため、一致が近くなります)。

関連する問題