2010-12-07 2 views
1

Мне нужно создать отчет, который содержит количество каждого рекламного кода, используемого в течение определенной недели. Пример структуры таблицы:Самый эффективный способ в MySQL для получения значений за определенную неделю?

CREATE TABLE `user_promo_codes` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id` bigint(20) unsigned NOT NULL, 
    `promo_code` longtext NOT NULL, 
    `last_updated` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
) 

Что я хочу - это количество каждого конкретного промо-кода, используемого в течение данной недели. Что у меня сейчас есть:

SELECT promo_code, count(*) AS count 
FROM user_promo_codes 
WHERE last_updated BETWEEN 
    FROM_UNIXTIME(# one week ago 
     UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 7 DAY)) - TIME_TO_SEC(NOW()) 
    ) 
    AND 
    FROM_UNIXTIME(
     UNIX_TIMESTAMP(NOW()) - TIME_TO_SEC(NOW()) 
    ) 
GROUP BY value 

Есть ли более эффективный способ сделать это?

+0

Вы * действительно * хотите сделать последнее_определенное поле индексом. :-) – 2010-12-07 22:14:02

ответ

1

Для типов данных, которые вы указали, это должно работать нормально в течение недели, предшествующей , теперь.

SELECT promo_code, COUNT(*) AS count 
FROM user_promo_codes 
WHERE last_updated BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW() 
GROUP BY promo_code 

Asides:

  • Использование LONGTEXT для promo_code обеспечит временную таблицу на диске. Вероятно, лучше всего сделать это VARCHAR(N).
  • Как отметил Миддапарка, индекс на last_updated станет бесценным по мере роста таблицы.

Update

С NOW() -> самый последний Wedneday @00:00:00.

SELECT promo_code, COUNT(*) AS count 
FROM user_promo_codes 
WHERE last_updated BETWEEN 
DATE_SUB(CONCAT(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE())+5 DAY) ,' 00:00:00'), INTERVAL 7 DAY) 
AND 
CONCAT(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE())+5 DAY) ,' 00:00:00') 
GROUP BY promo_code 

Что только выше

CONCAT(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE())+5 DAY) ,' 00:00:00') 

выгружена в течение NOW() с.

+0

Это большая часть того, что мне нужно, но важно, чтобы конечные точки этого предложения BETWEEN были такими, как я указал выше. Я не могу гарантировать, что сценарий будет запущен таким образом, что NOW() всегда будет в полночь в среду утром. – 2010-12-07 22:39:49

Смежные вопросы