问题现象
1.前端传一个时间区间
2.返回数据重复
解决办法(一步步来)
在sql出debug,是不是查询问题
万事不决问百度
将项目console里sql和入参放在sqlyog里执行
#sql传入三个入参,ewsd0001:用户
#2024-03-16 00:00:00.0(Timestamp) 任务结束时间
#null 任务开始时间 传入的2024-03-10 00:00:00在controller我们改成了null 通过IFNULL可以把开始时间定在1970-01-01
#ewsd0001(String), 2024-03-16 00:00:00.0(Timestamp), null
SELECT a.*,(CASE WHEN a.`is_finish` = 0 THEN TIMESTAMPDIFF(DAY, a.`create_time`,NOW()) WHEN a.`is_finish` = 1 THEN -1 END) AS delayDays,
c.card_name,p.plan_name,t.name project_name FROM t_project_template_task a
LEFT JOIN t_project_template_card c ON a.card_id = c.uuid
LEFT JOIN t_project_template_plan p ON c.plan_id = p.uuid
LEFT JOIN t_project_template t ON p.project_template_id = t.uuid AND t.type = 'project'
LEFT JOIN t_project_template_task_executor e ON a.uuid = e.task_id ,sys_user s
WHERE s.user_name_id = e.user_id AND e.user_id != "ewsd0001" AND
IFNULL(DATE_FORMAT(a.start_time,'%Y-%m-%d'),'1970-01-01') <= IFNULL(DATE_FORMAT("2024-03-13",'%Y-%m-%d'),'2099-01-01') AND
IFNULL(DATE_FORMAT(a.end_time,'%Y-%m-%d'),DATE_FORMAT(a.end_time,'%Y-%m-%d')) >= IFNULL(NULL,'1970-01-01')
ORDER BY a.create_time DESC
查询结果如下图
分析一下
我们是多表关联,以t_project_template_task
为主表,关联太多表不知道那个表和当前主表多对多,正常排除找错,要一步步关联,找出是按个表问题
我这里先去除t_project_template_task_executor
和sys_user
两张表及对应的where条件
执行sql如下
SELECT a.*,(CASE WHEN a.`is_finish` = 0 THEN TIMESTAMPDIFF(DAY, a.`create_time`,NOW()) WHEN a.`is_finish` = 1 THEN -1 END) AS delayDays,
c.card_name,p.plan_name,t.name project_name FROM t_project_template_task a
LEFT JOIN t_project_template_card c ON a.card_id = c.uuid
LEFT JOIN t_project_template_plan p ON c.plan_id = p.uuid
LEFT JOIN t_project_template t ON p.project_template_id = t.uuid AND t.type = 'project'
WHERE
IFNULL(DATE_FORMAT(a.start_time,'%Y-%m-%d'),'1970-01-01') <= IFNULL(DATE_FORMAT("2024-03-13",'%Y-%m-%d'),'2099-01-01') AND
IFNULL(DATE_FORMAT(a.end_time,'%Y-%m-%d'),DATE_FORMAT(a.end_time,'%Y-%m-%d')) >= IFNULL(NULL,'1970-01-01')
ORDER BY a.create_time DESC
结果显然就正确了,找到是关联这两张表的事。
你如果熟悉多对多: 出现多对多是因为多对多的这两个表where条件都是多个(或者叫范围或者区间)
注意:看例子(敲黑板),以我任务执行表t_project_template_task_executor,任务表t_project_template_task,用户表sys_user
先看任务执行表:就是关联任务表和用户表的中间人(工具表)(如下图)
1.固定一个任务可以查多个用户
SELECT e.`user_id`,a.* FROM t_project_template_task a
LEFT JOIN t_project_template_task_executor e ON e.`task_id` = a.uuid
WHERE e.`task_id` = "8472CF0EBD8F427AA65FC4DB92370047";
结果如下图
2.固定多个(一个时间区间或者范围)任务可以查多个用户
SELECT e.`user_id`,a.* FROM t_project_template_task a
LEFT JOIN t_project_template_task_executor e ON e.`task_id` = a.uuid
WHERE DATE_FORMAT(a.start_time,'%Y-%m-%d')<= DATE_FORMAT("2024-03-16",'%Y-%m-%d') AND
DATE_FORMAT(a.end_time,'%Y-%m-%d') >= IFNULL(NULL,'1970-01-01');
结果如下图
2.固定一个用户可以查多个任务
SELECT e.`user_id`,a.* FROM t_project_template_task a
LEFT JOIN t_project_template_task_executor e ON e.`task_id` = a.uuid
WHERE e.user_id = "wangzhaojuan" AND DATE_FORMAT(a.start_time,'%Y-%m-%d')<= DATE_FORMAT("2024-03-16",'%Y-%m-%d') AND
DATE_FORMAT(a.end_time,'%Y-%m-%d') >= IFNULL(NULL,'1970-01-01');
结果如下图
多对多:任务和用户,
我们查任务列表唯一的时候,用户固定一个。
我们查用户列表唯一的时候,任务固定一个。
不能关联的时候两边都是范围取值,
多表关联可以多对多,前提是另一个多对多表关联条件要固定一个。
总结
自己太菜,多练。