如何使用mysql获取最近10天的记录

bxgwgixi  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(871)

我想检索过去10天记录的所有数据,但当我添加一个“where”时,它不能像预期的那样工作。
我的表结构:

  1. CREATE TABLE `vip` (
  2. `id` int(11) NOT NULL auto_increment,
  3. `cancel_at_period_end` datetime NULL,
  4. `creation_date` datetime default NULL,
  5. `answer` varchar(5) collate utf8_unicode_ci default NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=499 ;

我使用了如下查询:

  1. SELECT days.day, count(users_vip.id) count
  2. FROM (SELECT curdate() as day
  3. union select curdate() - interval 1 day
  4. union select curdate() - interval 2 day
  5. union select curdate() - interval 3 day
  6. union select curdate() - interval 4 day
  7. union select curdate() - interval 5 day
  8. union select curdate() - interval 6 day
  9. union select curdate() - interval 7 day
  10. union select curdate() - interval 8 day
  11. union select curdate() - interval 9 day) days
  12. LEFT JOIN users_vip on days.day = CONVERT(users_vip.creation_date, date)
  13. WHERE users_vip.current_period_end_date >= NOW()
  14. GROUP BY days.day

输出为:

  1. date count
  2. 2018-08-15 1

我想要的结果应该是这样的:

  1. date count
  2. 2018-08-08 0
  3. 2018-08-09 0
  4. 2018-08-10 0
  5. 2018-08-11 0
  6. 2018-08-12 0
  7. 2018-08-13 0
  8. 2018-08-14 0
  9. 2018-08-15 1
  10. 2018-08-16 0
  11. 2018-08-17 0

更新:

  1. SELECT days.day, count(users_vip.id) count
  2. FROM (SELECT curdate() as day
  3. union select curdate() - interval 1 day
  4. union select curdate() - interval 2 day
  5. union select curdate() - interval 3 day
  6. union select curdate() - interval 4 day
  7. union select curdate() - interval 5 day
  8. union select curdate() - interval 6 day
  9. union select curdate() - interval 7 day
  10. union select curdate() - interval 8 day
  11. union select curdate() - interval 9 day) days
  12. LEFT JOIN users_vip on days.day = CONVERT(users_vip.creation_date, date) AND users_vip.current_period_end_date >= NOW()
  13. GROUP BY days.day
ac1kyiln

ac1kyiln1#

我认为您应该将日历表加入一个子查询,该子查询按天聚合计数:

  1. SELECT
  2. days.day AS date,
  3. COALESCE(t.cnt, 0) AS count
  4. FROM
  5. (
  6. SELECT CURDATE() AS day UNION
  7. SELECT CURDATE() - INTERVAL 1 day UNION
  8. SELECT CURDATE() - INTERVAL 2 day UNION
  9. SELECT CURDATE() - INTERVAL 3 day UNION
  10. SELECT CURDATE() - INTERVAL 4 day UNION
  11. SELECT CURDATE() - INTERVAL 5 day UNION
  12. SELECT CURDATE() - INTERVAL 6 day UNION
  13. SELECT CURDATE() - INTERVAL 7 day UNION
  14. SELECT CURDATE() - INTERVAL 8 day UNION
  15. SELECT CURDATE() - INTERVAL 9 day
  16. ) days
  17. LEFT JOIN
  18. (
  19. SELECT DATE(creation_date) AS date, COUNT(*) AS cnt
  20. FROM users_vip
  21. WHERE current_period_end_date >= NOW()
  22. GROUP BY DATE(creation_date)
  23. ) t
  24. ON days.day = t.date;
展开查看全部
juzqafwq

juzqafwq2#

我们可以改变 WHEREAND ,将 predicate 从 WHERE 条款 ON 条款。
我还避免使用函数 Package 器 creation_date ,以允许使用索引。我会重新编写匹配条件。
我会这样做:

  1. SELECT days.day
  2. , COUNT(users_vip.id) AS count
  3. FROM ( SELECT CURDATE() AS day
  4. UNION ALL SELECT CURATE() + INTERVAL -1 DAY
  5. UNION ALL SELECT CURATE() + INTERVAL -2 DAY
  6. UNION ALL SELECT CURATE() + INTERVAL -3 DAY
  7. UNION ALL SELECT CURATE() + INTERVAL -4 DAY
  8. UNION ALL SELECT CURATE() + INTERVAL -5 DAY
  9. UNION ALL SELECT CURATE() + INTERVAL -6 DAY
  10. UNION ALL SELECT CURATE() + INTERVAL -7 DAY
  11. UNION ALL SELECT CURATE() + INTERVAL -8 DAY
  12. UNION ALL SELECT CURATE() + INTERVAL -9 DAY
  13. ) days
  14. LEFT
  15. JOIN users_vip
  16. ON users_vip.creation_date >= days.day
  17. AND users_vip.creation_date < days.day + INTERVAL 1 DAY
  18. AND users_vip.current_period_end_date >= NOW()
  19. GROUP
  20. BY days.day
展开查看全部

相关问题