MySQL查询求助

Symon_Ci 2018-09-20 09:35:01
作为新人入职第一周就遇到困难了,希望能向各路大神请求到帮助,谢谢!

任务计划表:
task(ID, CREATE_TIME, TASK_TIME, …)

CREATE_TIME——创建时间
TASK_TIME——执行时间

查询某个月内(比如2018-08)的所有日期(2018-08-01至2018-08-31),每一天的
1、日期
2、新建任务数(CREATE_TIME在当天内)
3、执行任务数(TASK_TIME在当天内)
4、未执行数(CREATE_TIME<当天 且 TASK_TIME>当天)

task有三百多万数据,希望查询语句能尽量快一点
...全文
429 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
王的喵 2018-09-20
  • 打赏
  • 举报
回复
新建一个时间表dates 采用定时器每一天新增当天的日期
id date_number
1 2018-08-01
2 2018-08-02
3 2018-08-03
......
30 2018-08-30
31 2018-08-31


SELECT date_number,IFNULL(create_count,0),IFNULL(task_count,0),IFNULL(no_count,0) FROM dates d
LEFT JOIN (SELECT DATE(CREATE_TIME) dt,COUNT(1)AS create_count FROM task GROUP BY DATE(CREATE_TIME))createcount ON d.date_number=createcount.dt
LEFT JOIN (SELECT DATE(TASK_TIME) dt,COUNT(1)AS task_count FROM task GROUP BY DATE(TASK_TIME))taskcount ON d.date_number=taskcount.dt
LEFT JOIN (SELECT DATE(CREATE_TIME) dt,COUNT(1)AS no_count FROM task WHERE DATE(CREATE_TIME)<CURDATE() AND DATE(TASK_TIME)>CURDATE() GROUP BY DATE(CREATE_TIME))nocount ON d.date_number=nocount.dt

这个只是一个实现方式,300w的表应该没什么问题,具体优化自己去弄
ACMAIN_CHM 2018-09-20
  • 打赏
  • 举报
回复
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
Symon_Ci 2018-09-20
  • 打赏
  • 举报
回复
引用 1 楼 chen_0809 的回复:
新建一个时间表dates 采用定时器每一天新增当天的日期
id date_number
1 2018-08-01
2 2018-08-02
3 2018-08-03
......
30 2018-08-30
31 2018-08-31


SELECT date_number,IFNULL(create_count,0),IFNULL(task_count,0),IFNULL(no_count,0) FROM dates d
LEFT JOIN (SELECT DATE(CREATE_TIME) dt,COUNT(1)AS create_count FROM task GROUP BY DATE(CREATE_TIME))createcount ON d.date_number=createcount.dt
LEFT JOIN (SELECT DATE(TASK_TIME) dt,COUNT(1)AS task_count FROM task GROUP BY DATE(TASK_TIME))taskcount ON d.date_number=taskcount.dt
LEFT JOIN (SELECT DATE(CREATE_TIME) dt,COUNT(1)AS no_count FROM task WHERE DATE(CREATE_TIME)<CURDATE() AND DATE(TASK_TIME)>CURDATE() GROUP BY DATE(CREATE_TIME))nocount ON d.date_number=nocount.dt

这个只是一个实现方式,300w的表应该没什么问题,具体优化自己去弄


感谢关注,这是我按照你的思路写的SQL,但第4列未执行数(CREATE_TIME<当天 且 TASK_TIME>当天)查不出来,当天是指某一天的日期并不是CURDATE(),这个好像有点难办

SELECT
udate.RepDate,
IFNULL(ct.ctCount,0),
IFNULL(tk.tkCount,0)
FROM u_date AS udate

LEFT JOIN (
SELECT
DATE(task.CREATE_TIME) AS dt,
COUNT(0) AS ctCount
FROM e_escort_task AS task
GROUP BY dt
) AS ct ON udate.RepDate = ct.dt

LEFT JOIN (
SELECT
DATE(task.TASK_TIME) AS dt,
COUNT(0) AS tkCount
FROM e_escort_task AS task
GROUP BY dt
) AS tk ON udate.RepDate = tk.dt

WHERE udate.RepYear = 2018 AND udate.RepMonth = 9

56,682

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧