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_photo
s。这就是我使用LEFT OUTER JOIN
的原因。但是,如果它有cover_photo
s,它应该只得到那些thumbnail
。 cover_photo
每个organization
包含多张照片。
当我运行我的代码时,我没有得到我想要的东西。如果cover_photo
表中没有可用的thumbnails
,则将完全忽略特定的organization
。目前我没有任何组织的cover_photo
,所以我得到的是没有结果。
如何解决这个问题?
【问题讨论】:
评论不用于扩展讨论;这个对话是moved to chat。 【参考方案1】:基本上,您需要将LEFT JOIN
ed 表上的条件从WHERE
子句移动到LEFT JOIN
的ON
子句:否则,它成为强制性的,并过滤掉@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 从一个表中获取所有记录并从另一个表中获取可用记录的主要内容,如果未能解决你的问题,请参考以下文章
在 WHERE 子句中使用连接列时,Mysql 未在 LEFT JOIN 中使用索引