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

Posted

技术标签:

【中文标题】MySQL:使用带有 WHERE 子句的 JOINS 从一个表中获取所有记录并从另一个表中获取可用记录【英文标题】:MySQL: Using JOINS with WHERE clause to get all records from one table and available records from the other 【发布时间】:2020-10-09 05:41:54 【问题描述】:

我正在尝试运行如下 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_photos。这就是我使用LEFT OUTER JOIN 的原因。但是,如果它有cover_photos,它应该只得到那些thumbnailcover_photo 每个organization 包含多张照片。

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

如何解决这个问题?

【问题讨论】:

评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:

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

也就是说,改变这个:

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

【讨论】:

我试过这个。谢谢你。问题是,我注意到一些cover_photo 变得混杂了!这意味着,组织会得到错误的封面照片! @LemonJuice:我所做的只是修复了您的查询逻辑,这就是您的问题所关注的。我不知道您的数据(而且您没有显示),所以我无法判断问题出在哪里。也许您需要查看加入条件。 好的。从我的角度来看,你还需要什么?构建表的查询?让我知道,我会发布它们 @LemonJuice:我认为您在这里提出的问题已经得到解答。您可能想问一个新问题,提供示例数据、当前和期望的结果(并可能稍微简化查询 - select 子句中不需要这么多列来证明您面临的问题)。 答案是正确的。问题在于使用了错误的 ID。感谢您的支持【参考方案2】:

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 中右表中的列的条件(直接或间接检查此列是否为 NULL 和 null 安全比较除外)弹出左表在右表中没有匹配行的所有行。但 INNER 和 LEFT 联接之间的区别在于这些左无右行 - 即条件将 LEFT JOIN 转换为 INNER JOIN。

所以这个条件必须放在 ON 子句中——在加入之前会被检查/应用。

【讨论】:

以上是关于MySQL:使用带有 WHERE 子句的 JOINS 从一个表中获取所有记录并从另一个表中获取可用记录的主要内容,如果未能解决你的问题,请参考以下文章

mysql left join的深入探讨

在 WHERE 子句中使用连接列时,Mysql 未在 LEFT JOIN 中使用索引

带有 JOIN 和 WHERE 子句的 SQL 语句

MySQL LEFT JOIN 你可能需要了解的三点

带有 WHERE 子句的 SQL INNER JOIN 到 LINQ 格式

关于 MySQL LEFT JOIN 你可能需要了解的三点