我认为这两个查询是相同的。但结果证明,以四个 AND 开始的第一个查询的约束起作用了,返回了许多左连接的错误行。第二个查询的结果看起来是正确的。 谁能解释这两个查询之间的区别是什么? 这个问题与 this one 类似, 但我 100% 肯定结果是不同的。
SELECT uinfo.serial_number, uinfo.firmware, upd.objtype, upd.category
FROM UnitInfo uinfo
LEFT JOIN
UnitUpdateInfo upd
ON uinfo.serial_number = upd.serial_number
AND substring(uinfo.serial_number,1,2) NOT IN ('AB','CD','EF','GH')
AND substring(uinfo.serial_number,1,1) NOT LIKE 'M%'
AND upd.objtype ='HEEN'
AND TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(uinfo.firmware, '-', -2), '-', 1)) LIKE '3.0%'
SELECT uinfo.serial_number, uinfo.firmware, upd.objtype, upd.category
FROM UnitInfo uinfo
LEFT JOIN
UnitUpdateInfo upd
ON uinfo.serial_number = upd.serial_number
WHERE substring(uinfo.serial_number,1,2) NOT IN ('AB','CD','EF','GH')
AND substring(uinfo.serial_number,1,1) NOT LIKE 'M%'
AND upd.objtype ='HEEN'
AND TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(uinfo.firmware, '-', -2), '-', 1)) LIKE '3.0%'
[编辑]
第二个查询与:
SELECT uinfo.serial_number, uinfo.firmware, upd.objtype, upd.category
FROM UnitInfo uinfo
INNER JOIN
UnitUpdateInfo upd
ON uinfo.serial_number = upd.serial_number
WHERE substring(uinfo.serial_number,1,2) NOT IN ('AB','CD','EF','GH')
AND substring(uinfo.serial_number,1,1) NOT LIKE 'M%'
AND upd.objtype ='HEEN'
AND TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(uinfo.firmware, '-', -2), '-', 1)) LIKE '3.0%'
最佳答案
一旦 LEFT JOIN
中的右侧表有字段进行比较,例如WHERE
子句中的相等性,它实际上变成了 INNER JOIN
- 在您的查询中,您强制 UnitUpdateInfo 的
为非 NULL => 连接必须成功。objtype
字段
第一个查询,将所有连接逻辑作为 LEFT JOIN
的一部分,将包括第一个表中的所有行,这些行连接到第二个表中的那些行 - 第二个表字段为 NULL,其中无法加入。
第二个查询将不包括第一个表中未连接到第二个表的那些行。
关于mysql - 这两个mysql查询之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6432502/