MySQL:条件连接不显示用于计算纬度/经度之间距离的所有数据

标签 mysql sql

问题

我正在使用 if 语句执行条件连接,但它未能返回我理想情况下期望它返回的所有记录。

我的应用程序上的用户通过自动完成输入表单输入位置,并选择以英里为单位的距离。下面的查询中的硬编码纬度/经度坐标是用户在表单中输入的位置的纬度/经度坐标(因此它是动态的),距离是用户输入的以英里为单位的距离(也是动态的)。

查询应首先检查 at_resources 是否具有与其指定英里内的资源 ID 关联的“服务地点”。如果资源 ID 在 at_places_served 表中没有指定任何位置,则应使用 at_resources 中的 zipcode_name 列> 表作为后备。另请注意 zipcode_name 可以为 NULL

特别是,如果资源没有服务地点记录,它将使用其资源表记录来计算距离。

下面是我的代码和这个特定查询返回的屏幕截图。

如果您希望我为您提供示例 MySQL 数据,以便您了解表的样子或进一步解释任何内容,请告诉我。

谢谢您并致以问候。

代码

SELECT resource.id id, resource.resource_name_line_1, resource.resource_name_line_2, resource.resource_handle, zips.zip_display_name, zips.lat, zips.long,
MIN((3959 * acos(cos(radians(42.3122)) * cos(radians(zips.lat))
* cos(radians(zips.long) - radians(-71.1947)) + sin(radians(42.3122))
* sin(radians(zips.lat))))) AS distance
FROM at_resources resource
JOIN at_resources_places_served places_served
ON places_served.resource_id = resource.id
JOIN at_zip_mapping zip_mapping
ON IF(places_served.resource_id IS NOT NULL, zip_mapping.zip_name_id = places_served.zipcode_name_id AND places_served.active = 1, zip_mapping.zip_name_id = resource.zipcode_name AND resource.active = 1) 
JOIN at_zips zips
ON zips.id = zip_mapping.zip_id
GROUP BY resource.id
HAVING distance < 25
ORDER BY distance, resource.resource_name_line_1 ASC

这是一个 SQL fiddle :http://sqlfiddle.com/#!9/c17155/1

查询 enter image description here

最佳答案

试试这个:

SELECT 
   resource.id id, 
   resource.resource_name_line_1, 
   resource.resource_name_line_2, 
   resource.resource_handle, 
   zips.zip_display_name, 
   zips.lat, zips.long,
   MIN((3959 * acos(cos(radians(42.3122)) * cos(radians(zips.lat))
        * cos(radians(zips.long) - radians(-71.1947)) +
         sin(radians(42.3122))
        * sin(radians(zips.lat))))) AS distance
FROM at_resources resource
LEFT JOIN at_resources_places_served places_served
  ON places_served.resource_id = resource.id
LEFT JOIN at_zip_mapping zip_mapping_by_id
  ON 
     places_served.resource_id IS NOT NULL AND 
     zip_mapping_by_id.zip_name_id = places_served.zipcode_name_id AND 
     places_served.active = 1 
LEFT JOIN at_zip_mapping zip_mapping_by_zipcode
  ON 
     places_served.resource_id IS NULL AND 
     zip_mapping_by_zipcode.zip_name_id = resource.zipcode_name AND 
        resource.active = 1 
JOIN at_zips zips
   ON places_served.resource_id IS NOT NULL AND zips.id = zip_mapping_by_id.zip_id
JOIN at_zips zips_by_zipcode
   ON places_served.resource_id IS NULL AND 
      zips_by_zipcode.id = zip_mapping_by_zipcode.zip_id
GROUP BY resource.id
HAVING distance < 25
ORDER BY distance, resource.resource_name_line_1 ASC

更新:

如果places_served.resource_id不为空或者不为空,我会使用at_zips添加更多条件连接。

关于MySQL:条件连接不显示用于计算纬度/经度之间距离的所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36000620/

相关文章:

php - 管理员在不知道用户密码的情况下以用户身份登录?

mysql - MySQL 中的右外连接

mysql - Perl:如何将远程 MYSQL 表复制/镜像到另一个数据库?可能结构也不同?

mysql - 在 MySQL 中分组时如何获取具有最大日期的行?

mysql - 组织一系列项目的 SQL 语句,每组一个

php - 如何停止在 php 中打印 echo 语句?

MySQL 代码到 postgres

sql - MSSQL 中带有 XML 查询的存储过程参数给出 "argument must be string literal"

mysql - 联合所有和选择

SQL Server 登录禁用 Windows 身份验证