mysql on和where的用法问题

文章讨论了在两张表tb1和tb2中,按domain查询当天数据时,使用LEFTJOIN的不同方法导致结果差异的问题。方法1多出一点数据,因为LEFTJOIN保留了tb2中domain匹配但update_time非当天的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题

两张表tb1、tb2都有domain、update_time字段,需要按tb1.domain查出所有数据,并且tb1、tb2都是当天的数据。

最开始想到两种办法:

select tb1.*,tb2.* from 
(select * from tb1 where DATE(update_time)='{{{today}}}') t1
left join
(select * from tb2 where DATE(update_time)='{{{today}}}') t2
on t1.domain=t2.domain 
select tb1.*,tb2.* from 
tb1 left join tb2
on tb1.domain=tb2.domain 
where  DATE(tb1.update_time)='{{{today}}}' and (DATE(tb2.update_time)='{{{today}}}' or tb2.domain is null)

结果是前者比后者多了一点点数据。为什么呢?

二、解析

tb1

domainupdate_time
d1
d1
d2
d3

tb2

domainupdate_time
d1
d1
d2

方法(1)的数据是

domainupdate_timedomainupdate_time
d1d1
d2nullnull
d3nullnull

方法(2)的数据是

domainupdate_timedomainupdate_time
d1d1
d3nullnull

可以看到方法(2)的where直接把d2新的数据直接去掉了,正常应该是有d2数据的,虽然left join后tb2的数据是null

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值