2012-04-29 18 views
3

私は、ユーザーとほぼ同じアーティストが好きなユーザーを見つけることができるように音楽ウェブサイトを作成しています。2つの結果セットの類似点を比較する

私は2つの列 'id_user'、 'id_artist'を持つ 'like'テーブルを持っています。これらの2人のユーザーが共通の4組のアーティストを持って

User 1 likes: 
1, 12 
1, 13 
1, 14 
1, 26 
1, 42 
1, 44 

User 2 likes: 
2, 13 
2, 14 
2, 15 
2, 26 
2, 42 
2, 56 

: は、ここで私はそれが動作したい方法の例です。 2つの結果セットを比較して、データベースに最も類似した人物を見つける方法はありますか?

私の最初のアイデアは、そのようにして好きなものを連結することでした: "12,13,14,26,42,44"を文字列に入れ、mysql FULLTEXTのスコアを使って異なる文字列を比較してください。 それは動作しませんでした...理由は分かりませんが、mysqlフルテキストはテキストのみで動作します。数字ではありません...

アイデアやヒントがあれば幸いです。このような

答えて

2

何か:これは非常に効率的ではないことを

SELECT first_user.id_user, second_user.id_user, COUNT(first_user.id_user) AS total_matches 

FROM likes AS first_user 

JOIN likes AS second_user 
ON second_user.id_artist = first_user.id_artist 
AND second_user.id_user != first_user.id_user 

GROUP BY first_user.id_user, second_user.id_user 

ORDER BY total_matches DESC 

LIMIT 1 

注意。この問題を回避する1つの方法は、このクエリの出力を含む「キャッシュテーブル」を作成し、LIMIT 1部分を削除します。いくつかの関連するインデックスを追加し、このキャッシュテーブルをクエリします。このテーブルを定期的に更新するようにcronジョブを設定することができます。

例:

CREATE TABLE IF NOT EXISTS `likes` (
    `id_user` varchar(50) DEFAULT NULL, 
    `id_artist` varchar(50) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `likes` (`id_user`, `id_artist`) VALUES ('8', '39'), ('8', '37'), ('4', '37'), ('8', '24'), ('8', '7'), ('4', '28'), ('8', '28'), ('4', '27'), ('4', '11'), ('8', '49'), ('4', '7'), ('4', '40'), ('4', '29'), ('8', '22'), ('4', '29'), ('8', '11'), ('8', '28'), ('4', '7'), ('4', '31'), ('8', '42'), ('8', '25'), ('4', '25'), ('4', '17'), ('4', '32'), ('4', '46'), ('4', '19'), ('8', '34'), ('3', '32'), ('4', '21') 

+---------+---------+---------------+ 
| id_user | id_user | total_matches | 
+---------+---------+---------------+ 
| 8  | 4  |    7 | 
+---------+---------+---------------+ 
+0

ご協力ありがとうございました。あなたのお問い合わせはchramのように機能します:) – MonsieurNinja

+0

@sikkoは喜んでお手伝いします!あなたのプロジェクトで運が良ければ:) –

0

それはそれ自体にテーブルを結合することが可能です。 (テーブルの2つの "コピー"のうちの少なくとも1つにエイリアスを指定する必要がありますので、クエリがあいまいではありません)。

2人のユーザが与えられているので、 likeテーブルへの参加を自分自身に行うことによって。また、ユーザー2が共有するユーザー1の好きな割合は、左結合を行い、結果の数とヌルの数を両方数えることで見つけることができます。これは対称的な操作ではないことに注意してください。数字のいずれかまたは両方が0である場合に対処する必要があります。

「データベースで最も類似した人を探す」と言うと、これはすべてのユーザーのペアで行いますが、nユーザーの場合は、n*(n-1)/2の比較を行います。これはnの順になります。これは、多くのユーザーがいる場合にデータベースが行うべき非常に多くの作業です。

関連する問題