我有这张 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 BY
的 LIMIT
是没有意义的,因为关系数据库中没有顺序,除非您指定它。
活跃:
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/