exists取代内联基本例子

之前是exists理论mysql的EXISTS理论
但是今天写sql突然用到exists

原因:

任务表t_project_template_task和标签表t_project_template_task_label没有相互的关联外键
菜鸟的我一开始想不通怎么关联(习惯写on关联条件),后来就产生了内联

内联使用

#当前用户查询时间段的任务的label(label是json,存着label表的uuid) 后面就是 t1是五条数据
SELECT a.uuid,label  FROM t_project_template_task a
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
a.`label` IS NOT NULL AND
IFNULL(DATE_FORMAT(a.start_time,'%Y-%m-%d'),'1970-01-01') <= IFNULL("2024-03-20",'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;

执行结果
在这里插入图片描述

#t2是153条数据
SELECT * FROM t_project_template_task_label;

执行结果
在这里插入图片描述

#由于两个表没有关联外键,最后直接内联,笛卡尔乘积
#内联查找任务里包含的标签  t1是五条数据
# 内联结果就是 765条数据 再用where筛选(下面执行结果没加where执行)
SELECT t1.label,t2.`uuid` FROM 
(SELECT label  FROM t_project_template_task a
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
a.`label` IS NOT NULL AND
IFNULL(DATE_FORMAT(a.start_time,'%Y-%m-%d'),'1970-01-01') <= IFNULL("2024-03-20",'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 ) t1, `t_project_template_task_label` t2
WHERE  INSTR(t1.label,t2.`uuid`)  > 0

在这里插入图片描述

补充知识

因为我们目标是
在当前用户查询时间段的任务的label(label是json,存着label表的uuid) 存在那些label 用到instr函数
所以在多对多的时候加上 WHERE INSTR(t1.label,t2.uuid) > 0

用exists取代上面内联
#用exists取代内联,不知道性能是不是比内联高
SELECT t2.`uuid` FROM `t_project_template_task_label` t2
WHERE EXISTS(
SELECT 1 FROM
(SELECT label 
FROM t_project_template_task a
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
a.`label` IS NOT NULL AND
IFNULL(DATE_FORMAT(a.start_time,'%Y-%m-%d'),'1970-01-01') <= IFNULL("2024-03-20",'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 ) t1
WHERE  INSTR(t1.label,t2.`uuid`)  > 0
)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值