MySQL:使用带有 WHERE 子句的 JOINS 从一个 table 获取所有记录并从另一个获取可用记录

MySQL: Using JOINS with WHERE clause to get all records from one table and available records from the other

我正在尝试运行一个SQL查询如下

SELECT organization.idorganization,
organization.name,
organization.image_url,
organization.website,
organization.description,
organization.phone,
organization.email,
organization.spare_parts_items,
organization.specialty_vehicles,
organization.on_the_spot_service,
organization.home_visits,
organization.latitude,
organization.longitude,
organization.no_of_views,
 organization.is_disabled,
organization.date_created,
organization.last_update,
organization.address,
cover_photo.idcover_photo,
cover_photo.image_url,
cover_photo.thumbnail,
( 6371 * acos( cos( radians(7.294324) ) * cos( radians( organization.latitude ) ) * cos( radians( organization.longitude ) - radians(80.646185) ) 
+ sin( radians(7.294324) ) * sin( radians( organization.latitude ) ) ) ) AS distance 
FROM organization 
LEFT OUTER JOIN cover_photo ON cover_photo.idcover_photo = organization.idorganization
WHERE organization.idorganization_type =1 HAVING distance < 20 AND cover_photo.thumbnail=true

在这里,我的期望是从 organization 中获取所有记录,无论它是否有 cover_photo。这就是我使用 LEFT OUTER JOIN 的原因。但是,如果它有 cover_photos,它应该只得到那些 thumbnailcover_photo 每个 organization 包含不止一张照片。

当我 运行 我的代码时,我没有得到我要找的东西。如果 cover_photo table 中没有可用的 thumbnails,则完全忽略特定的 organization。目前我没有任何组织cover_photo,所以我得到的是没有结果。

如何解决这个问题?

基本上,您需要将 LEFT JOINed table 上的条件从 WHERE 子句移动到 LEFT JOINON 子句:否则,它将成为强制性的,并过滤掉 LEFT JOIN 不匹配的行。

也就是这样改:

LEFT OUTER JOIN cover_photo 
    ON  cover_photo.idcover_photo = organization.idorganization
WHERE organization.idorganization_type = 1 AND cover_photo.thumbnail = true
HAVING distance < 20

收件人:

LEFT OUTER JOIN cover_photo 
    ON  cover_photo.idcover_photo = organization.idorganization
    AND cover_photo.thumbnail = true
WHERE organization.idorganization_type = 1 
HAVING distance < 20

AND cover_photo.thumbnail=true移动到ON子句表达式:

... 
FROM organization  
LEFT OUTER JOIN cover_photo ON cover_photo.idcover_photo = organization.idorganization 
                           AND cover_photo.thumbnail=true 
WHERE organization.idorganization_type =1 
HAVING distance < 20 

LEFT JOIN 中右 table 列的条件(除了直接或间接检查此列是否为 NULL 和 null-safe 比较)弹出左 table 没有的所有行右边的匹配行 table。但是 INNER 和 LEFT 联接之间的区别在于这些 left-without-right 行 - 即条件将 LEFT JOIN 转换为 INNER JOIN。

所以这个条件必须放在 ON 子句中 - 它会在 checked/applied 加入之前。