如何从两张MySQL表按日期获取差异数据?SQL语句异常排查
你的SQL语句主要有两个问题,咱们一个个拆解说明:
1. LEFT JOIN 被 WHERE 条件“降级”成了 INNER JOIN
你用LEFT JOIN的初衷应该是想保留table1的所有记录,不管table2有没有匹配的对应条目。但你的WHERE a.updated > b.updated条件会直接过滤掉那些table2中没有匹配的记录——因为此时b.updated是NULL,而任何和NULL的比较结果都是UNKNOWN,无法满足WHERE条件。这就导致你的LEFT JOIN实际上和INNER JOIN效果一样,只保留了两边都有匹配的记录。
2. SELECT 子句包含了不存在的字段
你写了a.created,但从你提供的表结构来看,table1里并没有created这个字段,这会直接导致SQL执行报错,应该是个笔误,记得改成表中实际存在的字段(比如直接去掉这个字段)。
正确的SQL写法(分两种场景)
场景1:只找table1中在table2有对应记录,且更新的条目
这种情况用INNER JOIN更直观,因为我们只需要两边都匹配的记录:
SELECT a.`id`, a.`name`, a.`namespace`, a.`updated` FROM table1 AS a INNER JOIN table2 AS b ON a.`name` = b.`name` AND a.`namespace` = b.`namespace` WHERE a.`updated` > b.`updated`
代入你的测试数据,这条语句会返回table1中namespace为test/test3的那条记录(它的updated比table2里的对应记录晚一天)。
场景2:找table1中所有在table2没有对应记录,或者有对应但更新的条目
如果需要包含table1独有的条目,就用LEFT JOIN配合OR条件:
SELECT a.`id`, a.`name`, a.`namespace`, a.`updated` FROM table1 AS a LEFT JOIN table2 AS b ON a.`name` = b.`name` AND a.`namespace` = b.`namespace` WHERE b.`id` IS NULL OR a.`updated` > b.`updated`
这里用b.id IS NULL判断table2中没有匹配的记录,再加上更新的条件,就能覆盖所有你可能需要的情况。
内容的提问来源于stack exchange,提问作者stacker
相关产品推荐
相关产品推荐

