“いいね!”のSQLクエリを作成する方法
-
06-07-2019 - |
質問
現在、ユーザープロファイルに追加できるシステム(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