0

もう 1 つの初心者向け PostgreSQL の質問です。

私はこのようなものを持っています:

CREATE TABLE user (
  userID bigserial primary key,
  name varchar(50) NOT NULL,
  created timestamp NULL DEFAULT CURRENT_TIMESTAMP
)
CREATE TABLE session (
  sessionID bigserial primary key,
  userID int NOT NULL,
  lastAction timestamp NULL DEFAULT NULL,
  created timestamp NULL DEFAULT CURRENT_TIMESTAMP
)

CREATE TABLE action (
  actionID bigserial primary key,
  sessionID int NOT NULL,
  lastAction timestamp NULL DEFAULT NULL,
  created timestamp NULL DEFAULT CURRENT_TIMESTAMP
)

ユーザーは、それぞれが複数のセッション アクションを持つ多数のセッションを持つことができます。

各ユーザーには有効期限が切れるセッションがあり、その場合、新しいセッションが挿入され、ユーザーが実行するすべてのアクションがそこにカタログ化されます。

私の質問は、選択したユーザーのみ、彼のセッションからのみ、1 日前、2 日前、1 週間前、1 か月前、または常に発生した場合にのみ、アクションを取得するにはどうすればよいかということです。

私はドキュメントを見てきましたが、私interval()が探しているものだと思いますが、セッションを期限切れにする方法しか本当に知りません:

(part of a join here) e.lastAction >= now() - interval '4 hours'

それは私が必要なものを返すか、返さないかのどちらかです。しかし、1 日前、2 日前などに作成されたすべてのレコードを返すようにするにはどうすればよいでしょうか。SQL 構文とロジックは、まだ少し混乱しています。

理想的な世界では、このユーザーが 2 日間で何回のアクションを実行したかなどの質問をしたいと思います。リレーションシップとタイムスタンプを作成しましたが、クエリを作成して失敗しました。

4

1 に答える 1

1

actionsテーブルからどのタイムスタンプが必要かわかりません-作成されたタイムスタンプまたは最後のアクションのタイムスタンプ。いずれにせよ、必要なクエリは基本的な結合であり、ユーザー ID とタイム スタンプでフィルター処理します。

 select a.*
 from actions a join
      sessions s
      on a.sessionid = s.sessionid
where s.userid = v_userid and
      a.created >= now() - interval '1 day';

過去 2 日間のトランザクションが必要な場合は、集計を使用します。

 select count(*)
 from actions a join
      sessions s
      on a.sessionid = s.sessionid
where s.userid = v_userid and
      a.created >= now() - interval '2 day';
于 2013-07-29T01:40:13.147 に答える