如何使用表关系和时间戳选择记录?

时间:2013-07-29 00:13:40

标签: sql postgresql heroku timestamp pg

另一个新手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天内采取了多少行动?我创建了关系和时间戳,但是我写了一个查询,但我遇到了失败。

1 个答案:

答案 0 :(得分: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';

如果您想要过去两天的号码,您可以使用聚合:

 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';