2010-12-07 12 views
1

特定の週に使用された各プロモーションコードの数を提供するレポートを作成する必要があります。テーブル構造の例:与えられた週に値を取得する最も効率的な方法は?

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フィールドをインデックスにしたいと思っています。 :-) –

答えて

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:

  • promo_codeためLONGTEXTを使用すると、ディスク上の一時テーブルを確保します。おそらくそれを作るためにはVARCHAR(N)になるでしょう。
  • middaparkaが指摘したように、last_updatedのインデックスは、テーブルが成長するにつれて非常に重要になります。 00:00:00 @>最新Wedneday - NOW()

更新

NOW()秒間におけるスワップ

CONCAT(DATE_SUB(CURDATE(), INTERVAL WEEKDAY(CURDATE())+5 DAY) ,' 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 

+0

これは私が必要とするもののほとんどですが、そのBETWEEN節のエンドポイントは上記の通りです。私は、スクリプトがNOW()が常に水曜日の深夜になるように実行されることを保証することはできません。 –

関連する問題