MySql 别犯糊涂了! LEFT JOIN 的 ON 后接上筛选条件,多个条件会出事!
错误解释:
在MySQL中使用LEFT JOIN时,如果在ON子句后面直接加上额外的筛选条件,可能会导致查询结果不符合预期。因为ON子句是用来指定联结条件的,而在LEFT JOIN中,即使在ON子句中指定了条件,返回的结果集中也会包含左表(左边的表)的所有记录,即使右表(右边的表)中的记录可能不满足ON子句中的条件。
解决方法:
为了在LEFT JOIN中添加额外的筛选条件,同时保证左表的所有记录都会被包含在结果集中,应该将这些条件放在WHERE子句中,而不是ON子句。这样可以确保左表的所有记录都会被返回,并且只有当右表的记录满足这些额外条件时,才会将它们与左表的记录合并。
示例:
错误的查询方式:
SELECT *
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id AND t2.some_column = 'some_value';
正确的查询方式:
SELECT *
FROM table1 t1
LEFT JOIN table2 t2 ON t1.id = t2.id
WHERE t2.some_column = 'some_value';
在第二个查询中,ON子句仅用于联结两个表,而筛选条件t2.some\_column = 'some\_value'被放到了WHERE子句中,这样就能保证即使右表table2中不满足some\_column = 'some\_value'的记录也会出现在结果集中,只不过这些记录的右表对应字段会显示为NULL。
评论已关闭