質問

現在、ユーザープロファイルに追加できるシステム(phpとmysql)を構築しています 「お気に入りの音楽アーティスト」リストに。 「ユーザーのお気に入りを他のユーザーと比較し、「おすすめの友達」を返す方法を見つけようとしています。

例:

User A Likes
- 1
- 2
- 3
- 4

User B Likes
- 1 <- A likes
- 5
- 6
- 7

User C Likes
- 1 <- A likes
- 2 <- A likes
- 8
- 9

このユーザーAを使用すると、次の推奨事項が得られます。

User C
User B

これを行うには、リレーショナルデータベースを作成し、ユーザー入力のほとんどを標準化する必要があると思います。

だから私の質問は: この種の比較に最適なデータベース構造は何ですか? どのようなクエリを使用する必要がありますか? (正確である必要はありません)

役に立ちましたか?

解決

質問への直接的な回答ではありませんが、本プログラミングをチェックアウトすることをお勧めします。コレクティブインテリジェンス。あなたの質問に基づいて、あなたはそれが非常に役立つと思うと思います。

他のヒント

単純な実装は次のようになります

CREATE TABLE user_tbl(
    user_id BIGINT,
    ...
)

CREATE TABLE music_tbl(
    music_id BIGINT,
    ...
)

CREATE TABLE likes_tbl(
    user_id BIGINT,
    music_id BIGINT
)

特定のユーザーと好みが似ているすべてのユーザーを見つけるには、次のようにします。

select u1.user_id, u2.user_id, count(*) as weight from likes_tbl u1, likes_tbl u2
where u1.music_id = u2.music_id and u1.user_id <> u2.user_id and u1.user_id = @user_id
group by u1.user_id, u2.user_id

重量列は、ユーザーが列にいるアーティストの数です。したがって、重量が大きいほど、共通点が多くなります。そのため、体重が最も多い上位5人のユーザーを推奨できます。

これはさまざまな方法で拡張できます。可能性の1つは、genre_idをmusic_tblとlikes_tblに追加してから、genre_idで結合することです。

すでに投稿されているものを複製しないでください...

--
-- Working MySQL implementation of a "user compatibility" schema.
--


DROP TABLE IF EXISTS favourite;
DROP TABLE IF EXISTS artist;
DROP TABLE IF EXISTS users;


CREATE TABLE users (
 user_id INT NOT NULL AUTO_INCREMENT,
 name VARCHAR(32),
 PRIMARY KEY (user_id)
);


CREATE TABLE artist (
 artist_id INT NOT NULL AUTO_INCREMENT,
 name VARCHAR(32),
 PRIMARY KEY (artist_id)
);


CREATE TABLE favourite (
 favourite_id INT NOT NULL AUTO_INCREMENT,
 user_id INT NOT NULL,
 artist_id INT NOT NULL,
 UNIQUE (user_id, artist_id),
 PRIMARY KEY (favourite_id),
 FOREIGN KEY (user_id) REFERENCES users (user_id) ON DELETE CASCADE,
 FOREIGN KEY (artist_id) REFERENCES artist (artist_id) ON DELETE CASCADE
);


INSERT INTO users
 (name)
VALUES
 ("Alice"),
 ("Bob"),
 ("Carol"),
 ("Dave")
;


INSERT INTO artist
 (name)
VALUES
 ("Jewel"),
 ("Sarah McLachlan"),
 ("Britney Spears"),
 ("David Bowie"),
 ("The Doors")
;


INSERT INTO favourite
 (user_id, artist_id)
VALUES
 (
  (SELECT user_id FROM users WHERE name = "Alice"),
  (SELECT artist_id FROM artist WHERE name = "Jewel")
 ),
 (
  (SELECT user_id FROM users WHERE name = "Alice"),
  (SELECT artist_id FROM artist WHERE name = "Sarah McLachlan")
 ),
 (
  (SELECT user_id FROM users WHERE name = "Bob"),
  (SELECT artist_id FROM artist WHERE name = "Jewel")
 ),
 (
  (SELECT user_id FROM users WHERE name = "Bob"),
  (SELECT artist_id FROM artist WHERE name = "Sarah McLachlan")
 ),
 (
  (SELECT user_id FROM users WHERE name = "Bob"),
  (SELECT artist_id FROM artist WHERE name = "Britney Spears")
 ),
 (
  (SELECT user_id FROM users WHERE name = "Bob"),
  (SELECT artist_id FROM artist WHERE name = "David Bowie")
 ),
 (
  (SELECT user_id FROM users WHERE name = "Carol"),
  (SELECT artist_id FROM artist WHERE name = "David Bowie")
 ),
 (
  (SELECT user_id FROM users WHERE name = "Carol"),
  (SELECT artist_id FROM artist WHERE name = "The Doors")
 ),
 (
  (SELECT user_id FROM users WHERE name = "Dave"),
  (SELECT artist_id FROM artist WHERE name = "Jewel")
 ),
 (
  (SELECT user_id FROM users WHERE name = "Dave"),
  (SELECT artist_id FROM artist WHERE name = "The Doors")
 )
;


SELECT
 t0.user_id myuser,
 t1.user_id friend,
 COUNT(*)
FROM favourite t0
JOIN favourite t1 ON t1.artist_id = t0.artist_id
WHERE t0.user_id != t1.user_id
GROUP BY t0.user_id, t1.user_id;


--
-- The same thing, but returning names!
--

SELECT
 t0u.name myuser,
 t1u.name friend,
 COUNT(*)
FROM favourite t0
JOIN favourite t1 ON t1.artist_id = t0.artist_id
JOIN users t0u ON t0u.user_id = t0.user_id
JOIN users t1u ON t1u.user_id = t1.user_id
WHERE t0.user_id != t1.user_id
GROUP BY t0.user_id, t1.user_id;

がんばって!

アーティストテーブルとユーザーテーブルがある場合、ユーザーとお気に入りのアーティストという2つの外部キーを持つテーブルFavoriteArtistsを作成できます。

次に、似たようなお気に入りを持っている他のユーザーを取得し、しきい値のオーバーラップに基づいてユーザーに友人を推奨します。

テーブル

User
userid int
FirstName varchar(30)
LastName varchar(30)

Song
songid int
Title varchar(30)
Artist varchar(30)

UserSong
userid
songid

クエリ

select User.userid, User.FirstName, User.LastName
from UserSong
inner join Song
on UserSong.songid=Song.songid
inner join User
on UserSong.userid=User.userid
where Song.Artist='Some Artist'

自然結合を使用した詳細なクエリ

select User.userid, User.FirstName, User.LastName
from UserSong
natural join Song
natural join User
where Song.Artist='Some Artist'

(これはまだテストしていないことに注意してください。間違っていれば誰かが修正してくれます。)

上記のクエリでは、「いいね」したすべてのユーザーのリストが表示されます。指定されたアーティスト。その後、そのリストを使用して、他のユーザーがしていることを気に入っている他のユーザーを表示できます。

SQL Serverの場合:

CREATE TABLE Users (
UserID BIGINT IDENTITY (1,1) NOT NULL
--Other columns here
)


CREATE TABLE Artists (
ArtistID BIGINT IDENTITY(1,1) NOT NULL
-- Other columns
)


CREATE TABLE FavoriteArtists (
UserID BIGINT, ArtistID BIGINT )

同じいいねのあるユーザーを選択するクエリ:

SELECT 
FROM   FavoriteArtists u, FavoriteArtists f
WHERE  u.ArtistID = f.ArtistID AND u.UserID = @TARGET_USER AND f.UserID <> @TARGET_USER
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top