1

我有一个表用户:

id INT PRIMARY AUTO_INCREMENT
name VARCHAR(30) NOT NULL

我也有表帖

id INT PRIMARY AUTO_INCREMENT
post TEXT NOT NULL

如果用户访问某个帖子,我想在数据库中存储他已经查看过该帖子的某个位置。我将如何修改数据库以适应这种情况,以及我将如何查询用户没有看到的帖子。我应该创建一个新表来存储该信息吗?还是有其他一些巧妙的技巧?
这个想法是,我只是想要一种方式,如果用户一旦查看该帖子,他就无法再次查看它。
抱歉,我只是想学习数据库,这是我觉得非常有趣和困难的一项挑战。

4

3 回答 3

4

您将需要实现多对多关系:一个用户访问多个帖子,一个帖子被多个用户访问。

这将采用只有两列的表的形式,每列都是您现有表之一的外键:

CREATE TABLE user_post_visit (
    user_id INT NOT NULL,
    post_id INT NOT NULL,
    PRIMARY KEY (user_id, post_id),
    FOREIGN KEY (user_id) REFERENCES user(id),
    FOREIGN KEY (post_id) REFERENCES post(id)
);

每次用户查看帖子时,都会在此表中添加一条记录。为了查找给定用户尚未查看的帖子:

SELECT post.*
FROM post
LEFT JOIN user_post_visit AS upv
    ON (upv.post_id = post.id AND upv.user_id = <your user ID here>)
WHERE upv.post_id IS NULL;
于 2013-08-30T14:12:20.127 回答
0

使用 RandomSeed 建议在用户和帖子之间创建桥接表,然后使用以下命令查询用户查看的帖子:

SELECT post_id, post FROM user_post_visit, post WHERE user_post_visit.user_id=<user id>
于 2013-08-30T14:16:51.613 回答
0

看来我跟在@RandomSeed 后面。:D

在我看来,您想要多对多关系,因此您需要一个新表。你怎么做并不严格,但例如

表“read_post”或“unread_post”:

user_id, post_id

如果表是 unread_post (但您必须在创建新帖子时为每个用户创建新行),您可以显示未读帖子:

SELECT text FROM post INNER JOIN unread_post ON post.id = unread_post.post_id WHERE user_id = ?

如果 table 是 read_post 则未读,请参阅 RandomSeeds 答案。

于 2013-08-30T14:15:15.907 回答