2011-05-04 30 views
0

我正在開發自定義的購物車應用程序。查詢在特定時間後插入行

它有一個命中表:

id   int 
product_id int 
hit_time  datetime 
session_id varchar 

現在,當有人瀏覽產品,我記錄一個打擊。

我需要一個查詢,使得記錄應插入僅當hit_time具有30分鐘的差(對於相同PRODUCT_ID,和SESSION_ID)

例如:

記錄時先打

現在
id    product_id    hit_time    session_id 
------------------------------------------------------------------------ 
1     1     2011-01-01 06:30:00  abcxyzmno 
2     5     2011-01-01 06:32:00  abcxyzmno 

,如果在不到30分鐘遊客提供相同的session_id,用的product_id訪問產品頁面= 1,則數據不應該被插入

所以下面一行不應該被插入(因爲只有5分鐘的差)

3     1     2011-01-01 06:35:00  abcxyzmno 

但如果訪問者的訪問後30分鐘,對於同一種產品,它應該被記錄

3     1     2011-01-01 07:01:15  abcxyzmno 

我要單一插入查詢

我不想2查詢時,首先要選擇表最大時間,然後將其插入

有什麼幫助嗎?

回答

1

你在找這樣的事嗎?

INSERT INTO hits (product_id, hit_time, session_id) 
SELECT $product_id, current_timestamp, $session_id 
FROM hits 
WHERE NOT EXISTS (
     SELECT id 
     FROM hits 
     WHERE product_id = $product_id 
      AND session_id = $session_id 
    ) 
    OR (
      product_id = $product_id 
     AND session_id = $session_id 
     AND hit_time < current_timestamp - 30*60 
    ) 
LIMIT 1 

$product_id$session_id是產品和會話ID。

NOT EXISTS部分負責(product_id,session_id)尚未記錄的情況,第二部分負責(product_id,session_id)存在但超過30分鐘前的情況。而且,當然,LIMIT 1(product_id,session_id)在那裏並且比30分鐘前早,並且多次出現。