「MySql」leftJoin时条件语句的位置

142 阅读1分钟

问题

当使用lefJoin语句连表时,如果把条件语句写在了WHERE中会导致连表查询失败,如:

SELECT
	`article`.`id` AS `id`,
	`zan`.`article_id` AS `zan_article_id`,
FROM
	`articles` `article`
	LEFT JOIN `article_likes` `zan` ON `zan`.`article_id` = `article`.`id` 
	AND ( `article`.`id` = `zan`.`article_id` AND `zan`.`del_time` IS NULL )
WHERE
	( `zan`.`is_del` = ? ) 
GROUP BY
	`article`.`id`,
ORDER BY
	...

这是由于WHERE语句会跟着主表(也就是article表)走,但是在主表中是没有右表中的字段的,所以会报错。

解决方法

把要限制的条件(限制右表的条件)写在ON后面,这样就可以在连表之前过滤掉右表的数据,然后进行连表,如:

SELECT
	`article`.`id` AS `id`,
	`zan`.`article_id` AS `zan_article_id`,
FROM
	`articles` `article`
	LEFT JOIN `article_likes` `zan` ON `zan`.`article_id` = `article`.`id` 
	AND ( `article`.`id` = `zan`.`article_id` AND `zan`.`is_del` = ? AND`zan`.`del_time` IS NULL )

GROUP BY
	`article`.`id`,
ORDER BY
	...