我有一个表用户,它有:
id INT PRIMARY AUTO_INCREMENT
name VARCHAR(30) NOT NULL我还有桌椅
id INT PRIMARY AUTO_INCREMENT
post TEXT NOT NULL如果用户访问某个帖子,我想将其存储在数据库中,他已经查看了该帖子。我将如何修改数据库以适应这种情况,以及如何查询用户尚未看到的帖子。我应该创建一个新的表来存储这些信息吗?还是还有别的诡计?
我的想法是,我只是想要一种方式,如果用户查看的帖子,一旦他不能再查看它。
对不起,我只是想学习数据库,这是我发现的一个非常有趣和困难的挑战。
发布于 2013-08-30 14:12:20
您需要实现一个多对多关系:用户访问多个帖子,而一个Post由多个用户访问。
这将采取只有两个列的表的形式,每个列都是一个现有表的外键:
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-30 14:15:15
“看来我跟在后面,”兰登西德说。:D
在我看来,你想要多到多的关系,所以你需要一张新桌子。你如何做到这一点并不严格,例如
表"read_post“或"unread_post":
user_id,post_id
如果表为unread_post (但创建新帖子时必须为每个用户创建新行),则可以显示未读帖子:
从post内部联接unread_post ON post.id = unread_post.post_id中选择文本,其中user_id =?
如果表是read_post,请未读,请参阅RandomSeeds答案。
发布于 2013-08-30 14:16:51
使用RandomSeed建议的方法在用户和post之间创建桥接器表,然后使用以下方法查询用户查看的帖子:
SELECT post_id, post FROM user_post_visit, post WHERE user_post_visit.user_id=<user id>https://stackoverflow.com/questions/18534956
复制相似问题