Заявка за вмъкване на ред след определен период от време

Работя върху персонализирано приложение за пазарска количка.

Има таблица с попадения:

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 посети продуктовата страница с product_id =1 за по-малко от 30 минути, тогава данните не трябва да се вмъкват

Така че долният ред не трябва да се вмъква (защото има разлика само от 5 минути)

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

Но ако посетител посети след 30 минути за същия продукт, това трябва да се запише

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

Искам единична заявка за вмъкване

НЕ ИСКАМ 2 заявки, първо да избера максимално време от таблицата и след това да го вмъкна

Някаква помощ?


person I-M-JM    schedule 04.05.2011    source източник


Отговори (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 са идентификаторите на продукта и сесията.

Частта NOT EXISTS се грижи за случая, когато (product_id,session_id) все още не е записан, а втората част се грижи за случая, когато (product_id,session_id) е там, но е бил преди повече от 30 минути. И, разбира се, LIMIT 1 в случай (product_id,session_id) е там и е по-стар преди 30 минути и се появява няколко пъти.

person mu is too short    schedule 04.05.2011