我正在开发定制的购物车应用程序。
它有一个命中表:
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
现在,如果访问者具有相同的session_id,请在不到30分钟的时间内访问product_id = 1的产品页面,则不应插入数据
因此不应插入下面的行(因为只有5分钟的差异)
3 1 2011-01-01 06:35:00 abcxyzmno
但如果访客在30分钟后访问,对于同一产品,则应记录
3 1 2011-01-01 07:01:15 abcxyzmno
我想要单插入查询
我不想要2个查询,首先从表中选择最大时间,然后插入
任何帮助?
答案 0 :(得分: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
in case(product_id,session_id)存在且超过30分钟前出现多次。