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_photo
s,它应该只得到那些 thumbnail
。 cover_photo
每个 organization
包含不止一张照片。
当我 运行 我的代码时,我没有得到我要找的东西。如果 cover_photo
table 中没有可用的 thumbnails
,则完全忽略特定的 organization
。目前我没有任何组织cover_photo
,所以我得到的是没有结果。
如何解决这个问题?
基本上,您需要将 LEFT JOIN
ed table 上的条件从 WHERE
子句移动到 LEFT JOIN
的 ON
子句:否则,它将成为强制性的,并过滤掉 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 加入之前。
我正在尝试运行一个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_photo
s,它应该只得到那些 thumbnail
。 cover_photo
每个 organization
包含不止一张照片。
当我 运行 我的代码时,我没有得到我要找的东西。如果 cover_photo
table 中没有可用的 thumbnails
,则完全忽略特定的 organization
。目前我没有任何组织cover_photo
,所以我得到的是没有结果。
如何解决这个问题?
基本上,您需要将 LEFT JOIN
ed table 上的条件从 WHERE
子句移动到 LEFT JOIN
的 ON
子句:否则,它将成为强制性的,并过滤掉 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 加入之前。