如何在 MySQL/SQL 中存储评价和推荐歌曲或项目的数据
How to store data on who rated and recommended a song or item in MySQL/SQL
基本上,我试图记录推荐资源的人数以及推荐歌曲的人数和每个人的人数 - 但是我不确定如何在 relational database
.这是我的架构和 SQLFiddle
Link 上的示例:http://sqlfiddle.com/#!9/29063/1
这是我的 DDL:
CREATE TABLE IF NOT EXISTS Users(
userID INT NOT NULL AUTO_INCREMENT,
forename VARCHAR(100),
surname VARCHAR(100),
PRIMARY KEY(userID)
);
CREATE TABLE IF NOT EXISTS Type(
typeID INT NOT NULL AUTO_INCREMENT,
typeName VARCHAR(100),
PRIMARY KEY(typeID)
);
CREATE TABLE IF NOT EXISTS Songs(
songID INT NOT NULL AUTO_INCREMENT,
typeID INT NOT NULL,
songName VARCHAR(100),
rating INT,
recommended TINYINT(1),
FOREIGN KEY (typeID) REFERENCES Type(typeID),
PRIMARY KEY (songID)
);
INSERT INTO Users VALUES
(NULL, "Jack", "Son"),
(NULL, "Bob", "Marley"),
(NULL, "Ringo", "Star");
INSERT INTO Type VALUES
(NULL, "Rap"),
(NULL, "RnB"),
(NULL, "HipHop"),
(NULL, "Jazz");
INSERT INTO Songs VALUES
(NULL, 1, "California Love", 2, 1),
(NULL, 2, "Locked Up", 4, 0),
(NULL, 3, "Tell Em", 5, 0),
(NULL, 4, "Jazz it up", 1, 1);
您在 table Songs
中看到了 Rating
row/column - 我想记录谁评价了这首歌并将其存储在另一个 table 也许吧?我只想存储平均评分。我也想记录谁推荐了这首歌以及他们的详细信息。
我该怎么做?如果有人能给我模式或想法,我会节省很多时间和头痛。
使用 userid、songid 和 rating 列创建一个新的 table UserRating。可能还有一个日期栏,因为他们给它打分的时间。 Table 和 FKUserID int, FKSongID int, Rating it, RankDate datetime
。
然后您可以使用 select songs.id, AVG(Rating) from songs inner join UserRating on UserRating.FKSongID = songs.ID group by songs.id
这将按平均排名为您提供所有歌曲。
或者如果您需要用户评价的所有歌曲 Select * from users inner join UserRating on UserRating.FKUserID = user.ID
或者如果您需要所有评分高于 5 的歌曲
select * from songs inner join UserRating on UserRating.FKSongID = Songs.ID where rating > 5
等等等等
基本上,我试图记录推荐资源的人数以及推荐歌曲的人数和每个人的人数 - 但是我不确定如何在 relational database
.这是我的架构和 SQLFiddle
Link 上的示例:http://sqlfiddle.com/#!9/29063/1
这是我的 DDL:
CREATE TABLE IF NOT EXISTS Users(
userID INT NOT NULL AUTO_INCREMENT,
forename VARCHAR(100),
surname VARCHAR(100),
PRIMARY KEY(userID)
);
CREATE TABLE IF NOT EXISTS Type(
typeID INT NOT NULL AUTO_INCREMENT,
typeName VARCHAR(100),
PRIMARY KEY(typeID)
);
CREATE TABLE IF NOT EXISTS Songs(
songID INT NOT NULL AUTO_INCREMENT,
typeID INT NOT NULL,
songName VARCHAR(100),
rating INT,
recommended TINYINT(1),
FOREIGN KEY (typeID) REFERENCES Type(typeID),
PRIMARY KEY (songID)
);
INSERT INTO Users VALUES
(NULL, "Jack", "Son"),
(NULL, "Bob", "Marley"),
(NULL, "Ringo", "Star");
INSERT INTO Type VALUES
(NULL, "Rap"),
(NULL, "RnB"),
(NULL, "HipHop"),
(NULL, "Jazz");
INSERT INTO Songs VALUES
(NULL, 1, "California Love", 2, 1),
(NULL, 2, "Locked Up", 4, 0),
(NULL, 3, "Tell Em", 5, 0),
(NULL, 4, "Jazz it up", 1, 1);
您在 table Songs
中看到了 Rating
row/column - 我想记录谁评价了这首歌并将其存储在另一个 table 也许吧?我只想存储平均评分。我也想记录谁推荐了这首歌以及他们的详细信息。
我该怎么做?如果有人能给我模式或想法,我会节省很多时间和头痛。
使用 userid、songid 和 rating 列创建一个新的 table UserRating。可能还有一个日期栏,因为他们给它打分的时间。 Table 和 FKUserID int, FKSongID int, Rating it, RankDate datetime
。
然后您可以使用 select songs.id, AVG(Rating) from songs inner join UserRating on UserRating.FKSongID = songs.ID group by songs.id
这将按平均排名为您提供所有歌曲。
或者如果您需要用户评价的所有歌曲 Select * from users inner join UserRating on UserRating.FKUserID = user.ID
或者如果您需要所有评分高于 5 的歌曲
select * from songs inner join UserRating on UserRating.FKSongID = Songs.ID where rating > 5
等等等等