2013-07-29 54 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天前,一週前,一個月前或全部時間發生時間。

我看過的文檔,我認爲​​就是我要找的,但我只有真正懂得過期會話:

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

那一個或者返回我我需要什麼或它沒有。但是,如何讓它返回自1天前,2天前等創建的所有記錄.SQL語法和邏輯仍然有點令人困惑。

因此,在一個理想的世界中,我會想問一個問題,例如這個用戶在兩天內採取了多少動作?我有創建的關係和時間戳,但我寫了一個查詢,我遇到了失敗。

+0

考慮發佈相關示例數據和期望的輸出 – peterm

回答

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

感謝您的答覆。是否有理由選擇*。而不是隻選擇*? –

+0

你的問題是。 。 。 「我的問題是,我如何才能爲選擇用戶採取行動」,所以我想你只是想要採取行動。 –

相關問題