mysql - MySQL 在给定一周内检索值的最有效方法?

标签 mysql date-arithmetic

我需要生成一份报告,提供特定一周内使用的每个特定促销代码的计数。示例表结构:

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

有没有更有效的方法?

最佳答案

对于您显示的数据类型,这应该适用于现在的前一周。

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() -> 最近的星期三@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()

关于mysql - MySQL 在给定一周内检索值的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4382153/

相关文章:

mysql - Rails 脚手架方法的最佳实践

mysql - 在 MySQL 中不使用 'LIMIT' 查找第 4 或第 n 个最高薪水

php - 保护 MySQL 密码和管理多个帐户的最佳做法是什么?

sql - 如何从 postgresql 中的工作日编号获取日期名称?

sql - 如何在oracle中减去2个日期以获得小时和分钟的结果

MySQL查询2表不相关列

MySQL select 语句,表名源自数据库查询

MySQL如何填充范围内缺失的日期?

sql - Oracle 数据库 : getting time from total amount of minutes from the beginning of a day

java - 简单的 Java 日期计算