MySQL通过比较日期为活动,过期和非活动选择三个结果

时间:2015-01-19 08:08:58

标签: mysql

我有这张桌子

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查询来完成此操作?

1 个答案:

答案 0 :(得分:1)

未激活的:

SELECT * FROM your_table WHERE activated = 0 LIMIT 3;

请注意,没有LIMIT的{​​{1}}没有意义,因为关系数据库中没有订单,除非您指定它。

主动:

ORDER BY

已过期:

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;

您还可以限制每个状态并在一个查询中执行此操作,但这不是微不足道的(您必须使用变量)并且无论如何都会导致全表扫描。所以你什么都得不到。因此,我建议在三个查询中执行此操作。此外,上述查询将执行全表扫描。我刚发布它给你一个想法...