3

次のスキーマを使用して、同様の関心を持つユーザーを見つけようとしています..

USERS - ID name etc

Interests - ID UID PID

ここで、ID はインタレストの一意の ID、UIS はユーザー ID、PID は製品 ID です。SOで他の同様の質問を見てきましたが、正確な答えはありませんでした。

例 - John と同様の関心を持つユーザーを獲得することに関心があるとします。これは、2 つのテーブルがどのように見えるかを示しています ...

ID  Name
11  John
12  Mary
13  Scott
14  Tim

ID UID PID
3  12  123
4  12  231
5  12  612
6  13  123
7  13  612
8  14  931
9  14  214
10 11  123
11 11  231
12 11  781
13 11  612

その順番で結果を出してほしいです。

私が興味を持っているユーザーと他のすべてのユーザーとの交差を設定することを考えていました。ユーザーが関心を追加したり、別のユーザーが追加されたりするたびに実行する必要があるため、これはあまり良い解決策とは思えません。これは小さなプロジェクトであり、現時点ではユーザーを 100 人に制限しています。上記のアプローチは 100 2時間かかるため、まったく効率的ではないと思います。

誰かが私を正しい方向に導くことができますか? 可能な解決策は何ですか。また、上記の制約で最適な解決策はどれですか。私はそれを使用できるかどうかを確認するためにANNを見ています。

4

2 に答える 2

3

これは、各ユーザーが John と共通する関心の数を数えることから始まります。アプローチは、John の関心をすべて取得し、関心テーブルに結合して、共通の関心の数に集計することです。そのための SQL は次のとおりです。

select i.uid, COUNT(*) as cnt
from (select i.*
      from interests i join
           users u
           on i.uid = i.id
      where u.name = 'John'
     ) ilist join
     interests i
     on ilist.pid = i.pid and
        ilist.uid <> i.uid  -- forget about John
group by i.uid

ただし、実際には、数だけではなく、製品のリストが必要です。したがって、interests テーブルに再び参加する必要があります。

select i.*
from (select i.uid, COUNT(*) as cnt
      from (select i.*
            from interests i join
                 users u
                 on i.uid = i.id
            where u.name = 'John'
           ) ilist join
           interests i
           on ilist.pid = i.pid and
              ilist.uid <> i.uid  -- forget about John
      group by i.uid
     ) t join
     interests i
     on t.uid = i.uid
group by t.cnt, i.uid 
于 2013-05-01T14:35:59.810 に答える
0

次のクエリは、ユーザー 11 の興味に従って、少なくとも 2 つ以上の同様の興味を持つ他のユーザーを検索します。

SELECT in2.UID FROM users u
INNER JOIN interest in1 ON (in1.UID = u.ID)
INNER JOIN interest in2 ON (in2.PID = in1.PID AND in2.UID <> u.ID)
WHERE u.ID = 11
GROUP BY in2.UID
HAVING COUNT(in2.UID) >= 2
ORDER BY COUNT(in2.UID) DESC

ORDER BY により、最も類似した関心を持つユーザーが最初に表示されるようになります。HAVING COUNT(in2.UID) >= 2) は、見つかったユーザーが少なくとも 2 つ以上の同様の関心を持っていることを確認します。

于 2013-05-01T14:34:18.890 に答える