前提・実現したいこと
ユーザーの中から、「類似している」ユーザーのペアを一組探したいです。
ここでいう「類似している」とは、review
テーブルとtip
テーブルで被っているbusiness_id
の数のことを指します。(説明が難しいので、下の例で確認をお願いします。)
例えば、users
テーブルにBob
とAlex
というユーザーがいます。Bob
はreview
テーブルの中で、business_id
が01
と04
のお店のレビューをしています。一方で、Alex
はreview
テーブルの中で、business_id
が02
と04
のお店をレビューしており、Bob
もAlex
も同じ04
のお店をレビューしているので、1「類似している」となります。
同じようにtip
テーブルを見てみると、Bob
とAlex
は二人とも01
と04
のお店のコメントを残しているので、2「類似している」となり、合計で3「類似している」となりました。
他のユーザーを調べてみても、3「類似している」を超えるペアはいないので、最も「類似している」ユーザーのペアは、Bob
とAlex
であることが分かります。この一連の流れを行うコードを書きたいです。
最終的には、最も「類似している」数が多いペアを一組求めたいので、以下のような形になります。
user_id1 | user_id2 | similarity -------------------------------- Bob | Alex | 3
データセット
PostgreSQL
1-- business table 2CREATE TABLE business ( 3 business_id character varying(2) PRIMARY KEY, 4 name character varying(30) NOT NULL 5); 6 7-- review table 8CREATE TABLE review ( 9 review_id character varying(3) PRIMARY KEY, 10 business_id character varying(2), 11 user_id character varying(10), 12 stars smallint 13); 14 15-- tip table 16CREATE TABLE tip ( 17 tip_text text, 18 business_id character varying(2), 19 user_id character varying(10) 20); 21 22-- users 23CREATE TABLE users ( 24 user_id character varying(10) PRIMARY KEY 25); 26
PostgreSQL
1insert into business 2 values 3 ('01', 'Super Store'), 4 ('02', 'Family Store'), 5 ('03', 'Great Store'), 6 ('04', 'Everyday Store'); 7 8insert into review 9 values 10 ('000', '01', 'Bob', '1'), 11 ('100', '04', 'Bob', '5'), 12 ('200', '04', 'Alex', '4'), 13 ('300', '02', 'Chapman', '3'), 14 ('400', '03', 'Dong', '2'), 15 ('500', '01', 'Liz', '5'), 16 ('600', '03', 'Chapman', '2'), 17 ('700', '02', 'Alex', '1'), 18 ('800', '01', 'Dong', '5'), 19 ('900', '04', 'Dong', '3'); 20 21insert into tip 22 values 23 ('nice store', '01', 'Chapman'), 24 ('I dont like this store.', '01', 'Liz'), 25 ('AWSOME!', '04', 'Alex'), 26 ('great', '01', 'Alex'), 27 ('I often use this store.', '02', 'Alex'), 28 ('not good...', '03', 'Chapman'), 29 ('wonderful', '01', 'Bob'), 30 ('Very clean', '03', 'Dong'), 31 ('My mother likes it.', '02', 'Liz'), 32 ('Tasted food.', '04', 'Bob'); 33 34insert into users 35 values 36 ('Bob'), 37 ('Alex'), 38 ('Dong'), 39 ('Liz'), 40 ('Chapman');
試したこと
とりあえず、review
テーブルの方だけでもと思って取り組んでみたのですが、さっぱり分かりませんでした。
よろしくお願い致します。