MySQL 双层LEFT JOIN无法查询到存在的listingspecificsListPrice问题求助
问题根因
- 关联条件位置错误:你将
mls_images.imgOrder = 0的过滤条件放在了mls_forms_listing_specifics表的LEFT JOIN关联条件中,这就要求必须同时满足「房源ID匹配」和「关联到的图片记录排序为0」两个条件,才能匹配到挂牌价格表的记录,如果你是要筛选获取房源的第一张主图,应该把这个条件放到mls_images表的关联条件里。 - GROUP BY用法不规范:仅对
mls_subject_property.mls_listingID做分组,其余未分组的字段没有使用聚合函数,在开启SQL严格模式的数据库中会直接报错,非严格模式下也可能返回随机的非分组字段值,导致数据异常。
修正方案
调整关联条件的位置,规范分组逻辑即可,修正后的SQL参考如下:
SELECT mls_subject_property.*, mls_images.imagePath, mls_forms_listing_specifics.listingspecificsListPrice FROM mls_subject_property -- 第一个关联仅匹配排序为0的主图 LEFT JOIN mls_images ON mls_subject_property.mls_listingID = mls_images.mls_listingID AND mls_images.imgOrder = 0 -- 第二个关联仅匹配同房源ID的挂牌价格数据 LEFT JOIN mls_forms_listing_specifics ON mls_forms_listing_specifics.mls_listingID = mls_subject_property.mls_listingID WHERE userID = 413 -- 若确认每个房源最多只有一条匹配的图片和价格记录,可直接删除GROUP BY语句 GROUP BY mls_subject_property.mls_listingID, mls_images.imagePath, mls_forms_listing_specifics.listingspecificsListPrice
补充排查方法
如果调整后仍有问题,可先注释掉GROUP BY语句执行查询,确认listingspecificsListPrice字段是否有值返回,排查是否是分组逻辑导致的字段值被过滤。
内容的提问来源于stack exchange,提问作者William Howley
相关产品推荐
相关产品推荐

