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

これを行うためのより効率的な方法はありますか?

4

1 に答える 1

1

表示したデータ型の場合、これは今までの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

傍白:

  • LONGTEXTfor を使用すると、promo_codeディスク上の一時テーブルが確保されます。それを作るのがおそらく最善 VARCHAR(N)です。
  • middaparkaが指摘したように last_updated、テーブルが大きくなるにつれて、のインデックスは非常に貴重になります。

アップデート

NOW()->最新の水曜日@ 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()

于 2010-12-07T22:22:35.460 に答える