";喜欢“;PHP/MMySQL中的个人评论


"Liking" individual comments in PHP/MySQL

我用PHP和MySQL为我运行的奇幻电影联盟建立了一个网站(类似于奇幻足球,但用于电影)。每部电影的个人资料页面都有一个你可以留下评论的地方,我让这个部分正常工作。现在,我想添加"点赞"个人评论的功能,但我遇到了一些麻烦。我想我已经正确设置了"点赞"表,我可以为每条评论添加点赞,但在每条评论中显示点赞是另一回事。

以下是"注释"表的代码:

CREATE TABLE `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`movie_id` int(11) NOT NULL,
`player_id` tinyint(2) NOT NULL,
`date_time` datetime NOT NULL,
`comment` text CHARACTER SET utf8 NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是"点赞"表的代码:

CREATE TABLE `likes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`player_id` int(2) NOT NULL,
`comment_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `player_comment` (`player_id`,`comment_id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

以下是"玩家"表的代码:

CREATE TABLE `players` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(10) NOT NULL,
`username` char(10) NOT NULL,
`password` char(32) NOT NULL,
`email` varchar(100) NOT NULL DEFAULT '',
`active` tinyint(1) NOT NULL,
`admin` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

现在,这里是SQL语句,我用它来获取任何特定电影的所有注释:

SELECT comments.id as comment_id, comments.player_id, comments.date_time, comments.comment,
players.first_name
FROM comments
LEFT JOIN players on players.id = comments.player_id
WHERE movie_id = $movie_id
ORDER BY date_time ASC

我的问题是,我不知道如何在同一条声明中获得每条评论的所有赞。我希望能够显示每个喜欢特定评论的玩家的名字。所以我希望它看起来像这样:

  • 第1行:$comment
  • 第2行:$commenter_first_name
  • 第3行:$liker_first_name1、$liker_first_name2、$likeer_first_name3喜欢这个

我可以得到所有喜欢的个人评论如下:

SELECT first_name
FROM likes
LEFT JOIN players on players.id = likes.player_id
WHERE comment_id = 264
ORDER BY first_name ASC

但如果不使用实际的comment_id,我不知道如何将其合并。

希望这是合理的,我欢迎任何可能的帮助。

像这样的东西怎么样

SELECT comments.id as comment_id, comments.player_id, comments.date_time, comments.comment, likers.names
FROM comments
LEFT JOIN
    (SELECT comment_id, GROUP_CONCAT(first_name) AS names FROM likes 
    INNER JOIN players ON likes.player_id = players.id GROUP BY comment_id) AS likers 
ON comments.id = likers.comment_id
WHERE movie_id = $movie_id
ORDER BY date_time ASC

"喜欢者"表应该有这样的内容:

| (comment_id) | Bob,Jim,Kathy |

为了更好地设置列表格式,您可以指定一个分隔符:

GROUP_CONCAT(first_name SEPARATOR ', ') 

是否可以将链接添加到注释表?

CREATE TABLE `comments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`movie_id` int(11) NOT NULL,
`player_id` tinyint(2) NOT NULL,
`date_time` datetime NOT NULL,
`comment` text CHARACTER SET utf8 NOT NULL,
`likes` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后,当有人喜欢这个评论时,你只需在评论数据库中的赞数中添加+1,而不仅仅是在赞数数据库中。当有人删除他的同类时,你可以将数字改为-1

像这样:

"UPDATE comments SET likes=likes+1 WHERE id='$comment_id'";

我看到的问题是,你想向喜欢的人展示。。。

也许是这样的:

"SELECT comments.*, likes.* FROM comments INNER JOIN likes comments.id=likes.comment_id WHERE movie_id='$movie_id'";

您的选择:

"SELECT comments.id as comment_id, comments.player_id, comments.date_time, comments.comment, players.first_name, likes.player_id
FROM comments
LEFT JOIN players ON players.id=comments.player_id
INNER JOIN likes ON comments.id=likes.comment_id 
WHERE movie_id='$movie_id'
ORDER BY date_time ASC";

另一件事是,它只会向你返回喜欢该评论的人的ID。因此,我建议您也将用户名保存到点赞表中。