[編集] 価値がないので削除しました。
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
ここで、user_id 999 がまだ読んでいない過去 7 日間のすべての記事を取得するには、クエリは次のようになります。
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 | ユーザー ID | ip | 日にち ...
users テーブルができました。そしてニューステーブルがあります。
user_has_read テーブルのようなものが必要です...
id
time
user_id
news_id
そうすれば、ユーザーが最初に何かを表示したときに、このテーブルにエントリを追加して、ニュース項目に関連付けることができます。次に、このテーブルで user_id を検索して、以前にここに来たことがあるかどうかを確認します。
また、ナビゲーションを容易にするために、最近読んだ 10 件の記事へのリンクを含む「最近閲覧した記事」セクションを作成することもできます。
何かが読み取られたかどうかを判断するブール値フラグを使用できます。ユーザーが読みたいものに到達したら、データベースに移動してそのフラグを true に設定し、そのレコードが特定のユーザーによって既に表示されていることを示します。