MySQL 通过比较日期选择事件、过期和不活动三个结果

标签 mysql

我有这张 table

card_id | activated | expiry_date 
---------------------------------------------
1       |    0      | 19-01-2015 19:00
2       |    1      | 20-10-2014 08:00
3       |    1      | 04-12-2014 22:30
4       |    0      | 12-11-2015 10:00
5       |    1      | 01-02-2016 03:30
6       |    0      | 16-08-2015 16:00
7       |    1      | 13-06-2015 12:00
8       |    1      | 03-02-2015 01:30
9       |    0      | 18-02-2016 15:00
10      |    1      | 10-05-2015 12:30

我有激活的卡和未激活的卡,然后我还有它们的到期日期。

我希望根据激活字段的状态将这些结果分为三个类别(未激活、事件和过期),并将过期日期与当前时间进行比较,然后每个类别限制 3 个。

此案例的预期结果是:

未激活

card_id | activated | expiry_date 
---------------------------------------------
1       |    0      | 19-01-2015 19:00
4       |    0      | 12-11-2015 10:00
6       |    0      | 16-08-2015 16:00

活跃

card_id | activated | expiry_date 
---------------------------------------------
5       |    1      | 01-02-2016 03:30
7       |    1      | 13-06-2015 12:00
8       |    1      | 03-02-2015 01:30

已过期

card_id | activated | expiry_date 
---------------------------------------------
2       |    1      | 20-10-2014 08:00
3       |    1      | 04-12-2014 22:30

如何最好只使用一个 MySQL 查询来完成此操作?

最佳答案

未激活:

SELECT * FROM your_table WHERE activated = 0 LIMIT 3;

但请注意,没有 ORDER BYLIMIT 是没有意义的,因为关系数据库中没有顺序,除非您指定它。

活跃:

SELECT * FROM your_table WHERE activated = 1 AND expiry_date > CURDATE() LIMIT 3;

已过期:

SELECT * FROM your_table WHERE activated = 1 AND expiry_date < CURDATE() LIMIT 3;

如果您不必限制每个查询,我建议在一个查询中完成所有操作:

SELECT 
CASE WHEN activated = 0 THEN 'unactivated'
WHEN active = 1 AND expiry_date > CURDATE() THEN 'active'
WHEN active = 1 AND expiry_date < CURDATE() THEN 'expired'
END AS status,
yt.* FROM your_table yt;

您还可以限制每种状态并在一个查询中执行此操作,但这并不是一件小事(您必须使用变量),并且无论如何都会导致全表扫描。所以你什么也得不到。因此我建议分三个查询来完成。另外,上面的查询将进行全表扫描。我刚刚发布它是为了给你一个想法......

关于MySQL 通过比较日期选择事件、过期和不活动三个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28020259/

相关文章:

尝试创建检查数据的函数时出现 MySQL 错误代码?

php - 有了我的第一个项目想法,我走在正确的轨道上吗?

java - 无法为连接 URL null 创建类的 JDBC 驱动程序

mysql - 通过不显示空值进行分组

mysql - MySQL中如何组合多个查询?

php - 我们可以在内存缓存中存储具有相同键的多条记录吗?

Mysql IN(VARCHAR) 与 IN(INT)

php - 将关联的 PHP 数组插入 mysql 而无需键入每个单独的插入名称和值

mysql - sql server和mysql之间链接服务器上的分布式事务

php - PHP 中的 XML 输出 (UTF-8)