2010-12-07 27 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

您*真的*想讓last_updated字段成爲索引。 :-) – 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 

旁白:

  • 使用的promo_code一個LONGTEXT將確保在磁盤上的一個臨時表。可能最好做一個VARCHAR(N)
  • 正如middaparka指出的那樣,當表格增長時,last_updated上的索引將變得無價。

更新

隨着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

相關問題