2013-07-29 6 views
0

Другой новичок 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 дня назад, неделю назад, месяц назад или для всех время.

Я посмотрел на документы, и я думаю, что interval() является то, что я ищу, но я только знаю, как окончить сессии:

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

Это один либо возвращает мне то, что мне нужно или это не так. Но как мне заставить его вернуть все записи, созданные с 1 дня назад, 2 дня назад и т. Д. Синтаксис и логика SQL все еще немного запутанны.

Итак, в идеальном мире я хочу задать вопрос, как, сколько действий сделал этот пользователь за 2 дня? У меня созданы отношения и временные метки, но я пишу запрос, с которым я столкнулся с ошибкой.

+0

Рассмотрите возможность размещения соответствующих данных образца и желаемого результата – peterm

ответ

1

Я не уверен, какая временная метка вы хотите от таблицы actions - созданной или последней отметки времени действия. В любом случае, запрос вы хотите основной присоединиться, где вы фильтровать по идентификатору пользователя и штамп времени:

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

Спасибо за ответ. Есть ли причина, по которой он выбирает. * Вместо просто выбрать *? –

+0

Ваш вопрос есть. , , «Мой вопрос: как мне заняться захватом действий только для выбранного пользователя», поэтому я решил, что вам нужны только действия. –

Смежные вопросы