Mysql多表联查出现重复

问题现象

1.前端传一个时间区间

入参

2.返回数据重复

重复数据

解决办法(一步步来)

在sql出debug,是不是查询问题

sql问题

万事不决问百度

我们属于第二种原因

将项目console里sql和入参放在sqlyog里执行

log

#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_executorsys_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');

结果如下图
在这里插入图片描述
多对多:任务和用户,
我们查任务列表唯一的时候,用户固定一个。
我们查用户列表唯一的时候,任务固定一个。
不能关联的时候两边都是范围取值,
多表关联可以多对多,前提是另一个多对多表关联条件要固定一个。

总结

自己太菜,多练。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值