我有这张桌子
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查询来完成此操作?
答案 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;
您还可以限制每个状态并在一个查询中执行此操作,但这不是微不足道的(您必须使用变量)并且无论如何都会导致全表扫描。所以你什么都得不到。因此,我建议在三个查询中执行此操作。此外,上述查询将执行全表扫描。我刚发布它给你一个想法...