[编辑] 删除它,因为它不值得。
4 回答
确切的字段类型会根据您使用的数据库而有所不同,但这是一般技术:
您需要一个具有唯一 ID 的 users 表:
CREATE TABLE users (
user_id INTEGER PRIMARY KEY,
email VARCHAR(50) NULL,
password VARCHAR(32) NULL
);
以及您的新闻项目的表格:
CREATE TABLE articles (
article_id INTEGER PRIMARY KEY,
title VARCHAR(50) NULL,
pubdate DATETIMESTAMP,
body blob or whatever your database supports
);
最后是一个表格,指示哪些用户阅读了哪些文章:
CREATE TABLE users_articles (
article_id INTEGER,
user_id INTEGER,
read_date DATETIMESTAMP
);
根据您使用的查询以及您的数据库如何选择优化这些查询,该users_articles
表可能应该由 索引。article_id
现在,要获取过去 7 天内 user_id 999 尚未阅读的所有文章,您的查询将如下所示:
SELECT a.title, a.pubdate, a.body
FROM articles a
WHERE a.pubdate > date_sub(NOW(), INTERVAL "7 days")
AND NOT EXISTS (
SELECT *
FROM users_articles ua
WHERE ua.article_id = a.article_id
AND ua.user_id = 999
)
当然,这个查询的其他形式也是可能的。并且间隔语法会因一个数据库而异。但这就是它的要点。
每当用户阅读一篇文章时,您可以使用 user_id 和 article_id 以及当前时间戳插入/更新 users_articles 表。作为副作用,这还为您提供有关用户最近阅读的文章的信息。
我建议创建一个新表,您可以在其中保存文章和用户之间的关系。该表将如下所示:
新闻ID | 用户名 | 知识产权 | 日期 ...
你有一个用户表。你有一个新闻表。
你只需要像 user_has_read 表这样的东西......
id
time
user_id
news_id
这样,当用户第一次查看某些内容以将他们与新闻项目联系起来时,您可以向此表添加一个条目。然后在此表中查找他们的 user_id 以查看他们以前是否来过这里。
您现在还可以有一个“最近查看”部分,其中包含指向他们最近阅读的 10 篇内容的链接,以便于导航。
您可以有一个布尔标志来确定是否读取了某些内容。当用户获得您希望他/她阅读的任何内容时,您可以转到数据库并将该标志设置为 true,表明该记录已被特定用户看到。