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

Я работаю над индивидуальным приложением для корзины покупок.

У него есть таблица хитов:

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